UVA

来源:互联网 发布:淘宝代购服务点申请表 编辑:程序博客网 时间:2024/06/06 19:01
/*  法一:  设所给的两个面为a、b,将b固定,对a进行颠倒、旋转的有关处理,如下:  对a,循环考虑6种情况,分别是6个面作为上面的情况  在这6种情况中,每种都要进行3次旋转,也就是考虑4种情况(固定上下面的情况下,其他4个面,都要作为正面1次)    思路来自blog:  http://blog.csdn.net/qq_18738333/article/details/44968341*/
#include <iostream>#include <cstring>using namespace std;const int N = 20;char a[N], b[N], s[N];int dir[6][6] = { { 0, 1, 2, 3, 4, 5 }, { 1, 5, 2, 3, 0, 4 }, { 2, 1, 5, 0, 4, 3 }, { 3, 1, 0, 5, 4, 2 }, { 4, 5, 3, 2, 0, 1 }, { 5, 1, 3, 2, 4, 0 } };bool judge(){char tp[10]; // temp;for (int i = 0; i < 6; i++){for (int j = 0; j < 6; j++)tp[j] = a[dir[i][j]]; // 将骰子的状态,置为编号所代表的面为正方体上面tp[6] = 0;for (int i = 0; i < 4; i++) //除去上面和下面以外,剩下的4个面,轮流做前面{char ch = tp[1];tp[1] = tp[2];tp[2] = tp[4];tp[4] = tp[3];tp[3] = ch;if (!strcmp(tp, b)) return true;} }return false;}int main(){while (cin >> s){for (int i = 0; i < 6; i++) a[i] = s[i];for (int i = 0; i < 6; i++) b[i] = s[6 + i];a[6] = b[6] = 0;if (judge()) cout << "TRUE" << endl;else cout << "FALSE" << endl;}return 0;}




/*  法二:  法二真是看问题直抓本质的一种方法,初次搜索后看到时,简直觉得惊为天人啊!(此处成语好像运用不得当,不要在意这些细节,反正就是十分惊叹...)    总结一下法二,法二就是,根本不旋转、颠倒,而是找规律:何时两个正方形等价?  它们的6个面,可以组成3组相对的面,只要判断2个正方形的3个对立面是否一致即可    思路来自blog:  http://blog.csdn.net/qq_20480611/article/details/48899907*/

#include <iostream>using namespace std;const int N = 12;char a[N], b[N], s[N];int main(){while (cin >> s){int flag;for (int i = 0; i < 6; i++) a[i] = s[i];for (int i = 0; i < 6; i++) b[i] = s[i + 6];int i;for (i = 0; i < 3; i++){flag = 0;for (int j = 0; j < 6; j++){if (a[i] == b[j] && a[5 - i] == b[5 - j])//每次检查到b的一对和a相同的正对面,必须将b中这两个位置清零,避免这对面再后面的循环中,再次被用到,使得多对一的错误情况仍被程序判对{flag = 1;b[j] = b[5 - j] = 0;break;} }if (!flag) //如果没能在b中找到a中存在的一对面的颜色组合,则肯定是不同的正方体 break;}if (flag) cout << "TRUE" << endl;else cout << "FALSE" << endl;}return 0;}

/*  法三:  和法二有相似之处,都是用统计对面颜色组合的思想  不同的是,法三不像法二一样用循环枚举,而是直接保存在二维数组中,在检查对应数据是否一致    对于顺序,法三的处理方法是:对于每组对面,两种颜色先按原来的顺序累加一次,再交换顺序,再累加一次,这样就完全排除了顺序的影响*/

#include <iostream>#include <cstring> using namespace std;const int N = 130;const int M = 20;char a[N], b[N];char s[M];int cube1[N][N], cube2[N][N]; int main(){while (cin >> s){memset(cube1, 0, sizeof (cube1));memset(cube2, 0, sizeof (cube2));for (int i = 0; i < 6; i++) a[i] = s[i]; a[6] = 0;for (int i = 0; i < 6; i++) b[i] = s[i + 6]; b[6] = 0; for (int i = 0; i < 3; i++){cube1[a[i]][a[5 - i]]++;cube1[a[5 - i]][a[i]]++;cube2[b[i]][b[5 - i]]++;cube2[b[5 - i]][b[i]]++;}int i;for (i = 0; i < 3; i++)if (cube1[s[i]][s[5 - i]] != cube2[s[i]][s[5 - i]])break;if (i == 3) cout << "TRUE" << endl;else cout << "FALSE" << endl;}return 0;}


/*  法四:  和法二法三的本质类似,是我当时看到那种思路时,就想到,可以把一对面的颜色作为一对pair,定义两个元素个数为3的pair数组,先通过初始化(将pair中较大的元素换为first)数组,消除位置的影响,再对pair排序,如果排序后,两个pair数组里,面的组合完全一致,说明是同样的正方体*/

#include <iostream>#include <algorithm>using namespace std;typedef pair<int, int> p;const int N = 12;char a[N], b[N], s[N];p facea[3], faceb[3];void solve(){for (int i = 0; i < 3; i++) //排序前作处理,使得面的颜色组合和顺序无关 {if (facea[i].first < facea[i].second) swap(facea[i].first , facea[i].second);if (faceb[i].first < faceb[i].second) swap(faceb[i].first , faceb[i].second);}sort(facea, facea + 3); sort(faceb, faceb + 3);for (int i = 0; i < 3; i++)if (facea[i] != faceb[i]){cout << "FALSE" << endl;return;}cout << "TRUE" << endl;}int main(){while (cin >> s){for (int i = 0; i < 6; i++) a[i] = s[i];for (int i = 0; i < 6; i++) b[i] = s[i + 6];for (int i = 0; i < 3; i++){facea[i].first = a[i]; facea[i].second = a[5 - i];faceb[i].first = b[i]; faceb[i].second = b[5 - i];}solve();}return 0;}




原创粉丝点击