八数码问题(八数码难题)+数据

题目在这里

#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;
}

思路:暴力广度优先搜索+暴力判重(使用启发式搜索+康托展开更好)

原文地址:https://www.cnblogs.com/frankying/p/6685032.html