八数码

//输入
// 2 3 4  
// 1 5 0  
// 7 6 8

// 1 2 3 
// 4 5 6 
// 7 8 0

//输出
// l
// 2 3 4 
// 1 0 5 
// 7 6 8 

// d
// 2 3 4 
// 1 6 5 
// 7 0 8 

// r
// 2 3 4 
// 1 6 5 
// 7 8 0 

// u
// 2 3 4 
// 1 6 0 
// 7 8 5 

// u
// 2 3 0 
// 1 6 4 
// 7 8 5 

// l
// 2 0 3 
// 1 6 4 
// 7 8 5 

// l
// 0 2 3 
// 1 6 4 
// 7 8 5 

// d
// 1 2 3 
// 0 6 4 
// 7 8 5 

// d
// 1 2 3 
// 7 6 4 
// 0 8 5 

// r
// 1 2 3 
// 7 6 4 
// 8 0 5 

// u
// 1 2 3 
// 7 0 4 
// 8 6 5 

// r
// 1 2 3 
// 7 4 0 
// 8 6 5 

// d
// 1 2 3 
// 7 4 5 
// 8 6 0 

// l
// 1 2 3 
// 7 4 5 
// 8 0 6 

// l
// 1 2 3 
// 7 4 5 
// 0 8 6 

// u
// 1 2 3 
// 0 4 5 
// 7 8 6 

// r
// 1 2 3 
// 4 0 5 
// 7 8 6 

// r
// 1 2 3 
// 4 5 0 
// 7 8 6 

// d
// 1 2 3 
// 4 5 6 
// 7 8 0 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
#define DEBUG
const int maxn=1000+5,maxv=26,INF=0x3f3f3f3f,mod=100000000;
typedef int State[9];
const int maxstate=1000000;
State st[maxstate],goal;
int dist[maxstate];
const int dx[]={1,-1,0,0};
const int dy[]={0,0,1,-1};
set<int>vis;
int fa[maxstate],op[maxstate];
void init(){vis.clear();}
int tryt(int s){
    int v=0;
    for(int i=0;i<9;i++)v=v*10+st[s][i];
    if(vis.count(v))return 0;
    vis.insert(v);
    return 1;
}
int bfs(){
    init();
    int front=1,rear=2;
    while(frontif(memcmp(goal,s,sizeof(s))==0)return front;
        int z;
        for(z=0;z<9;z++)if(!s[z])break;
        int x=z%3,y=z/3;
        for(int d=0;d<4;d++){
            int newx=x+dx[d];
            int newy=y+dy[d];
            int newz=newx+newy*3;
            if(newx>=0&&newx<3&&newy>=0&&newy<3){
                State& t=st[rear];
                memcpy(&t,&s,sizeof(s));
                t[newz]=s[z];
                t[z]=s[newz];
                dist[rear]=dist[front]+1;
                if(tryt(rear)){fa[rear]=front;op[rear]=d;rear++;}
            }
        }
    front++;
    }
    return 0;
}
void print(int ans){
    int t=op[ans];
    char c;
    switch(t){
        case 0:
        c='r';
        break;
        case 1:
        c='l';
        break;
        case 2:
        c='d';
        break;
        case 3:
        c='u';
        break;
    }
    if(ans!=1){
        print(fa[ans]);
        printf("%c\n",c);
        for(int i=0;i<3;i++){
            for(int j=0;j<3;j++){
                printf("%d ",st[ans][i*3+j]);
            }
            printf("\n");
        }
        printf("\n");
    }
}
int main(){
#ifdef DEBUG
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif
    for(int i=0;i<9;i++)cin>>st[1][i];
    for(int i=0;i<9;i++)cin>>goal[i];
    memset(fa,-1,sizeof(fa));
    int ans=bfs();
    if(ans>0){print(ans);printf("\n");}
    else printf("unsolvable\n");
#ifdef DEBUG
    fclose(stdin);
    fclose(stdout);
#endif
    return 0;
}

你可能感兴趣的:(八数码)