八数码

完全不记得自己是怎么写的了kkk

只记得写完以后超级开心^^

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define NUM 801989
 4 long long h[NUM];
 5 long long aa,bb;
 6 int k1,k2,head,tail;
 7 int oo;
 8 int x[5] = {0, 1, 0, -1, 0};
 9 int y[5] = {0, 0, 1, 0, -1};
10 int dui[10000][5];
11 struct MM{
12     int a[100][100];
13 }kkk[100];
14 bool sou( long long m ){
15     long long u = m % NUM;
16     while( h[u] !=m && h[u] !=0 ) u++;
17     if( h[u] == 0 ) {
18         h[u] = m;
19         return true;
20     }
21     return false;
22 }
23 long long jisuan(int k){
24     long long u=0;
25     for (int i=0 ; i<=2 ; i++)
26         for(int j=0 ; j<=2 ; j++){
27             u = u*10 + kkk[k].a[i][j];    
28         }    
29     return u;
30 }
31 void search (int u){
32         
33     while(tail!=head){
34         head++;
35         long long g;
36         for(int i=1 ; i<=4 ; i++){
37             int xx = dui[head][1]+x[i], yy = dui[head][2]+y[i] ;
38             if( xx>=0 && xx<=2 && yy>=0 && yy<=2 ){
39                 u++;
40                 for(int mm=0;mm<=2;mm++)
41                     for(int hh=0;hh<=2;hh++)
42                         kkk[u].a[mm][hh]=kkk[dui[head][4]].a[mm][hh];
43                 swap( kkk[u].a[dui[head][1]][dui[head][2]] , kkk[u].a[xx][yy] );
44                     g= jisuan(u);
45                 if( g==bb ) {
46                     cout<<dui[head][3]+1;
47                     return ;
48                 }
49                 
50                 if( sou(g) ) {
51                     dui[++tail][1]=xx;
52                     dui[tail][2]=yy;
53                     dui[tail][3]=dui[head][3]+1;
54                     dui[tail][4]=u;
55                     cout<<xx<<" "<<yy<<" "<<dui[tail][3]<<" "<<g<<endl;
56                 }
57                 swap(  kkk[dui[head][4]].a[xx][yy], kkk[u].a[dui[head][1]][dui[head][2]] );
58             }
59         }
60     }
61 }
62 int main(){
63     for (int i=0 ; i<=2 ; i++)
64         for(int j=0 ; j<=2 ; j++){
65             cin >> kkk[2].a[i][j];
66             aa = aa*10 + kkk[2].a[i][j];
67             if( kkk[2].a[i][j] == 9 ) k1 = i , k2 = j;
68         }
69     for ( int i=0 ; i<=2 ; i++)
70         for( int j=0 ; j<=2 ; j++){
71             cin >> kkk[1].a[i][j];
72             bb = bb*10 + kkk[1].a[i][j];
73         }
74     h[ aa%NUM ] = aa;
75     head=0;tail=1;
76     dui[1][1]=k1,dui[1][2]=k2,dui[1][3]=0,dui[1][4]=2;
77     search(2);
78     return 0;    
79 }

 

posted @ 2018-08-11 09:28  GCCCC  阅读(261)  评论(0)    收藏  举报