去年现场,虎哥1Y的,现在刷刷题,找找状态...
一共6种转法,把3个面放到顶部,左旋和右旋,感觉写的还不错....都写成常数了。
#include <stdio.h> #include <math.h> #include <string.h> #include <queue> #include <algorithm> #define LL long long using namespace std; struct node { int num[24]; int st; }; int dr[12] = {6,2,10,7,3,0,11,8,4,1,9,5}; int dc[12] = {5,9,1,4,8,11,0,3,7,10,2,6}; int a[12] = {2,3,5,6,7,8,11,12,13,14,16,17}; int b[12] = {12,13,11,16,17,14,10,18,19,15,20,21}; int c[12] = {0,2,22,4,5,6,20,10,11,12,18,16}; int aim[6][4] = { {0,1,2,3}, {4,5,10,11}, {6,7,12,13}, {8,9,14,15}, {16,17,18,19}, {20,21,22,23} }; int judge(int *p) { int ans = 0,i,j; for(i = 0;i < 6;i ++) { for(j = 1;j < 4;j ++) { if(p[aim[i][j]] != p[aim[i][0]]) break; } if(j == 4) ans ++; } return ans; } int main() { node u,v; int n,i,ans; while(scanf("%d",&n)!=EOF) { for(i = 0;i < 24;i ++) { scanf("%d",&u.num[i]); } u.st = 0; queue<node>que; que.push(u); ans = 0; while(!que.empty()) { u = que.front(); que.pop(); if(ans == 6) break; ans = max(ans,judge(u.num)); if(u.st == n) continue; v.st = u.st + 1; //a for(i = 0;i < 24;i ++) { v.num[i] = u.num[i]; } for(i = 0;i < 12;i ++) { v.num[a[dr[i]]] = u.num[a[i]]; } que.push(v); for(i = 0;i < 12;i ++) { v.num[a[dc[i]]] = u.num[a[i]]; } que.push(v); //b for(i = 0;i < 24;i ++) { v.num[i] = u.num[i]; } for(i = 0;i < 12;i ++) { v.num[b[dr[i]]] = u.num[b[i]]; } que.push(v); for(i = 0;i < 12;i ++) { v.num[b[dc[i]]] = u.num[b[i]]; } que.push(v); //c for(i = 0;i < 24;i ++) { v.num[i] = u.num[i]; } for(i = 0;i < 12;i ++) { v.num[c[dr[i]]] = u.num[c[i]]; } que.push(v); for(i = 0;i < 12;i ++) { v.num[c[dc[i]]] = u.num[c[i]]; } que.push(v); } printf("%d\n",ans); } return 0; }