八数码
完全不记得自己是怎么写的了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 }

浙公网安备 33010602011771号