八数码裸bfs
#define DeBUG #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <vector> #include <stack> #include <queue> #include <string> #include <set> #include <sstream> #include <map> #include <bitset> #include<time.h> using namespace std ; #define zero {0} #define INF 2000000000 #define EPS 1e-6 typedef long long LL; const double PI = acos(-1.0); inline int sgn(double x) { return fabs(x) < EPS ? 0 :(x < 0 ? -1 : 1); } int n;//n*n struct MAP { int mp[10][10];//状态 int step[100];//回溯方向 int stepnum;//步数 int x,y;//保存当前0位置 inline bool operator ==(const MAP &a) { for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { if(mp[i][j]!=a.mp[i][j]) return false; } return true; } }; MAP origin;//初始态 MAP goal; int dir[4][2]= {0,1,0,-1,-1,0,1,0}; void Reset() { memset(origin.mp,-1,sizeof(origin.mp)); int num=1; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { origin.mp[i][j]=num++; } } origin.mp[n][n]=0; origin.x=n; origin.y=n; memset(origin.step,-1,sizeof(origin.step)); origin.stepnum=0; } int maxx=1; MAP bfs() { queue<MAP>Q; Q.push(origin); MAP now; int m,k; while(!Q.empty()) { now=Q.front(); Q.pop(); int len=now.stepnum; // printf("%d %d\n",len+1,maxx++); m=now.y; k=now.x; for(int l=0; l<4; l++) { if((l==0&&now.step[len-1]==1)|| (l==1&&now.step[len-1]==0)|| (l==2&&now.step[len-1]==3)|| (l==3&&now.step[len-1]==2)) continue; int ni=m+dir[l][0]; int nj=k+dir[l][1]; if(now.mp[ni][nj]>=0) { swap(now.mp[m][k],now.mp[ni][nj]); now.step[now.stepnum++]=l; now.x=nj; now.y=ni; if(now==goal) { // printf("%d\n",now.stepnum); // printf("Time used = %.0lf ms\n",(double)(1000*clock()/CLOCKS_PER_SEC));//********************** // system("pause"); return now; } else { Q.push(now); now.x=k; now.y=m; now.stepnum--; now.step[len]=-1; swap(now.mp[m][k],now.mp[ni][nj]); } } } } printf("%d\n",now.stepnum); return now; } int main() { #ifdef DeBUGs freopen("C:\\Users\\Sky\\Desktop\\1.in","r",stdin); // freopen("C:\\Users\\Sky\\Desktop\\打表.txt","w",stdout);//PLEASE DELETE IT!!!!!!!!!!!!!!!!!!!!!!!! #endif while(scanf("%d", &n)+1) { MAP it; Reset(); for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { scanf("%d", &goal.mp[i][j]); } } it=bfs(); printf("%d\n",it.stepnum); for(int i=it.stepnum-1;i>=0;i--) { switch(it.step[i]) { case 0: printf("l"); break; case 1: printf("r"); break; case 2: printf("d"); break; case 3: printf("u"); break; default: printf("kao"); } } printf("\n"); } return 0; } /* 3 5 1 3 4 2 6 0 7 8 3 6 2 8 1 0 3 4 7 5 3 2 7 3 1 8 4 5 0 6 3 7 5 3 1 0 4 2 8 6 3 3 4 1 0 2 6 7 5 8 3 3 1 5 2 0 8 4 7 6 3 1 5 2 7 4 8 0 6 3 3 4 0 8 5 6 1 7 3 2 3 4 5 0 2 3 1 7 8 6 3 2 6 8 4 5 7 1 3 0 3 1 2 3 4 5 6 7 0 8 8 uurdldrr 16 rullddrrulurdldr 13 uuldrrdllurdr 20 rdlulurdldrulurdldrr 15 urrdllurdrulddr 14 uldrrullddrurd 10 urrdluurdd 17 rddluurddlulurrdd 12 dlurdllurdrd 20 uldruuldldrruulldrdr 1 r 请按任意键继续. . . */