BFS+多維數組判重,狀態數爲8!。輸出其實根本不用判斷60個字符一行,由於BFS到22層就已經有了40316左右中狀況,接近所有的40320。因此即便再強的數據也不會到達60步。程序仿的,這個題不是很會。node
/* ID:jzzlee1 PROB:msquare LANG:C++ */ //#include<iostream> #include<fstream> #include<cstring> #include<queue> #include<string> using namespace std; ifstream cin("msquare.in"); ofstream cout("msquare.out"); short r[3][5]; //目標狀態 short a[3][5]; //初始狀態 short tmp; bool vis[9][9][9][9][9][9][9]; //判重 struct node //表明每種狀態的類型 { int dep; //當前的操做序列的長度 string str; //當前的操做序列 short b[3][5];//當前的狀態 }q[50000]; //BFS時用到的隊列 最多40320種狀態,每種狀態只訪問一次 int head,tail; void input() { for(int j=1; j<=4; j++) cin>>r[1][j]; for(int i=4; i>=1; i--) cin>>r[2][i]; for(int i=1; i<=4; i++) { a[1][i] = i; a[2][i] = 8-i+1; } } inline void A(short (*b)[5]) //操做A { for(int i=1; i<=4; i++) { tmp = b[1][i]; b[1][i] = b[2][i]; b[2][i] = tmp; } } inline void B(short (*b)[5]) { b[1][0] = b[1][4]; b[2][0] = b[2][4]; for(int i=4; i>=1; i--) { b[1][i] = b[1][i-1]; b[2][i] = b[2][i-1]; } } inline void C(short (*b)[5]) { tmp = b[1][3]; b[1][3] = b[1][2]; b[1][2] = b[2][2]; b[2][2] = b[2][3]; b[2][3] = tmp; } inline bool isequal(short (*r)[5],short (*b)[5]) { for(int i=1; i<=2; i++) for(int j=1; j<=4; j++) if(r[i][j]!=b[i][j]) return false; return true; } void BFS() { memset(vis,0,sizeof(vis)); //初始化隊首元素 memcpy(q[0].b,a,sizeof(a)); q[0].dep=0; q[0].str = ""; head = 0; tail = 1; vis[q[0].b[1][1]][q[0].b[1][2]][q[0].b[1][3]][q[0].b[1][4]][q[0].b[2][1]][q[0].b[2][2]][q[0].b[2][3]] = 1; node next; node p; while(1) { p = q[head]; head++; head%=50000; if(isequal(r,p.b)) { cout<<p.dep<<endl; cout<<p.str<<endl; break; } //A next = p; next.dep = p.dep+1; next.str = p.str+"A"; A(next.b); if(!vis[next.b[1][1]][next.b[1][2]][next.b[1][3]][next.b[1][4]][next.b[2][1]][next.b[2][2]][next.b[2][3]]) { q[tail] = next; tail++; tail%=50000; vis[next.b[1][1]][next.b[1][2]][next.b[1][3]][next.b[1][4]][next.b[2][1]][next.b[2][2]][next.b[2][3]] = 1; } //B next = p; next.dep = p.dep+1; next.str = p.str+"B"; B(next.b); if(!vis[next.b[1][1]][next.b[1][2]][next.b[1][3]][next.b[1][4]][next.b[2][1]][next.b[2][2]][next.b[2][3]]) { q[tail] = next; tail++; tail%=50000; vis[next.b[1][1]][next.b[1][2]][next.b[1][3]][next.b[1][4]][next.b[2][1]][next.b[2][2]][next.b[2][3]] = 1; } //C next = p; next.dep = p.dep+1; next.str = p.str+"C"; C(next.b); if(!vis[next.b[1][1]][next.b[1][2]][next.b[1][3]][next.b[1][4]][next.b[2][1]][next.b[2][2]][next.b[2][3]]) { q[tail] = next; tail++; tail%=50000; vis[next.b[1][1]][next.b[1][2]][next.b[1][3]][next.b[1][4]][next.b[2][1]][next.b[2][2]][next.b[2][3]] = 1; } } } int main() { input(); BFS(); return 0; }