八数码问题。用hash(康托展开)判重
bfs(TLE)
1 #include<cstdio> 2 #include<iostream> 3 #include<queue> 4 #include<cstring> 5 using namespace std; 6 int fac[]={1,1,2,6,24,120,720,5040,40320,362880}; 7 bool hash_map[400000]; 8 int data[400000][12]; 9 queue<int> q; 10 //data[][9]存储上一个状态,data[][10]存储到这个状态的操作,data[][11]存储这个状态中9的位置 11 char s[110]; 12 int mem; 13 int hash1(int s[]) 14 { 15 int i,j,cnt,sum=0; 16 for(i=0;i<9;i++) 17 { 18 cnt=0; 19 for(j=i+1;j<9;j++) 20 if(s[j]<s[i]) 21 cnt++; 22 sum+=cnt*fac[8-i]; 23 } 24 return sum; 25 } 26 void print(int x) 27 { 28 if(data[x][9]==0) return; 29 print(data[x][9]); 30 if(data[x][10]==1) 31 putchar('l'); 32 else if(data[x][10]==2) 33 putchar('r'); 34 else if(data[x][10]==3) 35 putchar('u'); 36 else putchar('d'); 37 } 38 int main() 39 { 40 char ch; 41 int i,j,a,b,t,p; 42 while(cin.getline(s,100)) 43 { 44 memset(data,0,sizeof(data)); 45 memset(hash_map,0,sizeof(hash_map)); 46 b=mem=1; 47 j=0; 48 for(i=0;s[i]!='