POJ1077 八数码 BFS
BFS 几天的超时...
A*算法不会,哪天再看去了.
1 /* 2 倒搜超时, 3 改成顺序搜超时 4 然后把记录路径改成只记录当前点的操作,把上次的位置记录下AC..不完整的人生啊 5 */ 6 7 #include <iostream> 8 #include <queue> 9 #include <vector> 10 #include <iterator> 11 #include <string> 12 using namespace std; 13 14 const int MAXX_SIZE = 362885; 15 16 int fac[] = {1,1,2,6,24,120,720,5040,40320}; 17 bool used[MAXX_SIZE]; 18 19 struct Nod 20 { 21 string str; //数组 22 int postion9; //可交换的位置 23 }nod[MAXX_SIZE]; 24 25 struct Step 26 { 27 int last; 28 char c; //l0, r1, u2, d3 29 30 }step[MAXX_SIZE]; 31 32 int dir[][2] = {1,0, -1,0, 0,1, 0,-1 }; 33 34 char st[] = {'d', 'u', 'r', 'l'}; 35 36 int Kt(string str, int n) 37 { 38 int i, j, cnt, sum=0; 39 for (i=0; i<n; i++) 40 { 41 cnt = 0; 42 for (j=i+1; j<n; j++) 43 if (str[i] > str[j]) 44 cnt++; 45 sum += cnt * fac[n-1-i]; 46 } 47 return sum; 48 } 49 50 string InverKt(int sum, int n) 51 { 52 int i, j, t; 53 bool Int[20]; 54 string str; 55 for (i=0; i<n; i++) 56 { 57 t = sum / fac[n-1-i]; 58 for (j=0; j<n; j++) 59 { 60 if (Int[j]) 61 { 62 if (t == 0) 63 break; 64 t--; 65 } 66 } 67 str += j+1+'0'; 68 Int[j] = false; 69 sum %= fac[n-1-i]; 70 } 71 //str += '\0'; 72 return str; 73 } 74 75 76 void bfs(string str, int pos) 77 { 78 queue<int>que; 79 80 //string str = "123456789"; 81 int i, m, n = Kt(str, 9); 82 int ii, jj, ti, tj, t; 83 84 nod[n].str = str; 85 nod[n].postion9 = pos; 86 step[n].last = -1; 87 que.push(n); 88 used[n] = true; 89 90 while (!que.empty()) 91 { 92 n = que.front(); 93 que.pop(); 94 ii = nod[n].postion9 / 3; 95 jj = nod[n].postion9 % 3; 96 for (i=0; i<4; i++) 97 { 98 ti = ii + dir[i][0]; 99 tj = jj + dir[i][1]; 100 if (ti < 0 || ti > 2 || tj < 0 || tj > 2) 101 continue; 102 t = ti*3+tj; 103 swap(nod[n].str[nod[n].postion9], nod[n].str[t]); 104 m = Kt(nod[n].str, 9); 105 106 if (!used[m]) 107 { 108 used[m] = true; 109 nod[m].str = nod[n].str; 110 nod[m].postion9 = t; 111 step[m].last = n; 112 step[m].c = st[i] ; 113 //step[m].str = step[n] + st[i]; 超时! 114 if (m == 0) 115 return ; 116 que.push(m); 117 } 118 swap(nod[n].str[nod[n].postion9], nod[n].str[t]); 119 } 120 } 121 } 122 123 void show(int m) 124 { 125 if (step[m].last == -1) 126 return; 127 show(step[m].last); 128 cout<<step[m].c; 129 } 130 131 int main() 132 { 133 134 int i, n=9, m, pos; 135 char c; 136 string str; 137 for (i=0; i<n; i++) 138 { 139 cin>>c; 140 if (c == 'x') 141 { 142 pos = i; 143 c = '9'; 144 } 145 str+= c; 146 } 147 bfs(str, pos); 148 // m = Kt(str, n); 149 if (!used[0]) 150 cout<<"unsolvable"<<endl; 151 else 152 show(0); 153 return 0; 154 }