Friday, April 24, 2015

UVa 11959 - Dice

// UVa 11959 - Dice

#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;

class Die {
	// Represents a regular 3D die.
private:
	const static int number_of_corners = 8;
	int faces[7];
	vector<int> getCorner(int a, int b, int c) {
		vector<int> corner;
		corner.push_back(faces[a]);
		corner.push_back(faces[b]);
		corner.push_back(faces[c]);
		if (corner[1] < corner[0] && corner[1] < corner[2]) {
			int tmp = corner[0];
			corner[0] = corner[1];
			corner[1] = corner[2];
			corner[2] = tmp;
		} else if (corner[2] < corner[0] && corner[2] < corner[1]) {
			int tmp = corner[0];
			corner[0] = corner[2];
			corner[2] = corner[1];
			corner[1] = tmp;
		}
		return corner;
	}
public:
	Die(int front, int back, int left, int right, int bottom, int top) {
		faces[1] = front;
		faces[2] = back;
		faces[3] = left;
		faces[4] = right;
		faces[5] = bottom;
		faces[6] = top;
	}
	// gets all corners of the dice as three colors in clockwise order
	vector<vector<int> > getCorners() {
		vector<vector<int> > corners;
		corners.push_back(getCorner(6, 1, 3));
		corners.push_back(getCorner(6, 4, 1));
		corners.push_back(getCorner(6, 2, 4));
		corners.push_back(getCorner(6, 3, 2));
		corners.push_back(getCorner(5, 1, 4));
		corners.push_back(getCorner(5, 3, 1));
		corners.push_back(getCorner(5, 2, 3));
		corners.push_back(getCorner(5, 4, 2));
		return corners;
	}
	// returns true if both dice are exactly the same, i.e. they look the same to a human observer
	bool compare(Die anotherDie) {
		vector<vector<int> > thisCorners = getCorners();
		vector<vector<int> > otherCorners = anotherDie.getCorners();

		bool matched[number_of_corners] = { 0 };
		for (int i = 0; i < number_of_corners; i++) {
			bool found = false;
			for (int j = 0; j < number_of_corners && !found; j++)
				if (!matched[j] && thisCorners[i][0] == otherCorners[j][0] && thisCorners[i][1] == otherCorners[j][1] && thisCorners[i][2] == otherCorners[j][2]) {
					matched[j] = true;
					found = true;
					break;
				}
			if (!found)
				return false;
		}
		return true;
	}

};

Die buildDie(int s) {
	int top = s / 100000;
	int bot = s / 10000 % 10;
	int fro = s / 1000 % 10;
	int lft = s / 100 % 10;
	int bck = s / 10 % 10;
	int rgt = s % 10;
	return Die(fro, bck, lft, rgt, bot, top);
}

int main() {
	int cases;
	cin >> cases;
	for (int cas = 1; cas <= cases; cas++) {
		int s[2];
		cin >> s[0] >> s[1];
		Die d1 = buildDie(s[0]);
		Die d2 = buildDie(s[1]);
		cout << (d1.compare(d2) ? "Equal" : "Not Equal") << endl;
	}
	return 0;
}

No comments:

Post a Comment