八数码问题(八数码难题)+数据
#include <cstdio> #include <cstring> struct Map{int data[4][4],x,y,tot = 0;}; Map queue[400000]; int t = 1,w = 2,right[4][4],ans = -1; int px[5] = {0,-1,0,1,0},py[5] = {0,0,1,0,-1}; void swap(int &A,int &B){int temp = A;A = B;B = temp;} bool inqueue[9][9][9][9][9][9][9][9]; bool judge(Map x){ for(int i = 1;i <= 3;i++) for(int j = 1;j <= 3;j++) if(x.data[i][j] != right[i][j]) return 0; return 1; } bool Iq(Map x,bool pp){inqueue[x.data[1][1]][x.data[1][2]][x.data[1][3]][x.data[2][1]][x.data[2][2]][x.data[2][3]][x.data[3][1]][x.data[3][2]] = pp;} bool iq(Map x){return inqueue[x.data[1][1]][x.data[1][2]][x.data[1][3]][x.data[2][1]][x.data[2][2]][x.data[2][3]][x.data[3][1]][x.data[3][2]];} void bfs(){ while(t < w){ Map x; for(int i = 1;i <= 4;i++){ x = queue[t]; int xx = x.x + px[i],yy = x.y + py[i]; if(xx < 1 || xx > 3 || yy < 1 || yy > 3)continue; swap(x.data[x.x][x.y],x.data[xx][yy]); if(iq(x)){continue;} x.x = xx;x.y = yy;x.tot++;Iq(x,1); if(judge(x)){ans = x.tot;return;} queue[w++] = x; } t++; } } int main() { memset(inqueue,0,sizeof(inqueue)); for(int i = 1;i <= 3;i++) for(int j = 1;j <= 3;j++){ scanf("%d",&queue[1].data[i][j]); if(queue[1].data[i][j] == 0){queue[1].x = i;queue[1].y = j;} } for(int i = 1;i <= 3;i++) for(int j = 1;j <= 3;j++) scanf("%d",&right[i][j]); if(judge(queue[1])){printf("0");return 0;} Iq(queue[1],1); bfs(); ans != -1 && ans <= 20 ? printf("%d",ans) : printf("No solution!"); return 0; }
思路:暴力广度优先搜索+暴力判重(使用启发式搜索+康托展开更好)