迭代加深搜索
无限深度的搜索 , 选择迭代加深
每搜完一次 depMax += 1
直接搜会TLE
所以加一些很显然的优化
1. 每次进行完一个操作后下一个操作就别进行与之相对的操作
2. 用8(中心那一圈数字的个数)减去中心那一圈里最多相同的数字 , 如果这个数加上当前深度大于 depMax 显然不可能在指定深度下找到答案
很明显第二种剪枝效果要好很多
扫描二维码关注公众号,回复:
7722704 查看本文章
Code:
1 #pragma GCC optimize(2) 2 #include<cmath> 3 #include<cstdio> 4 #include<cstring> 5 #include<cstdlib> 6 #include<queue> 7 #include<vector> 8 #include<iostream> 9 #include<algorithm> 10 #define N 40 11 #define debug 1 12 #define osu auto 13 #define FILETEST 1 14 #define inf 1000010 15 #define ll long long 16 #define ha 998244353 17 #define INF 0x7fffffff 18 #define pii std::pair <int, int> 19 #define INF_T 9223372036854775807 20 #define APART puts("----------------------") 21 #define DEBUG printf("%s %d\n",__FUNCTION__,__LINE__) 22 23 namespace chino{ 24 25 const char nos[] = "No moves needed"; 26 const int checkX[] = {7, 8, 9, 12, 13, 16, 17, 18}; 27 const int back[10] = {5, 4, 7, 6, 1, 0, 3, 2, -1, -1}; 28 const int moveNext[9][8] = { 29 {1, 3, 7, 12, 16, 21, 23}, 30 {2, 4, 9, 13, 18, 22, 24}, 31 {11, 10, 9, 8, 7, 6, 5}, 32 {20, 19, 18, 17, 16, 15, 14}, 33 {24, 22, 18, 13, 9, 4, 2}, 34 {23, 21, 16, 12, 7, 3, 1}, 35 {14, 15, 16, 17, 18, 19, 20}, 36 {5, 6, 7, 8, 9, 10, 11}, 37 }; 38 39 inline void setting(){ 40 #if FILETEST 41 freopen("_test.in", "r", stdin); 42 freopen("_test.me.out", "w", stdout); 43 #endif 44 return; 45 } 46 47 inline int read(){ 48 register char c = getchar(), up = c; register int num = 0; 49 for(; c < '0' || c > '9'; up = c, c = getchar()) if(c == EOF) exit(0); 50 for(; c >= '0' && c <= '9'; num = (num << 3) + (num << 1) + (c ^ '0'), c = getchar()) if(c == EOF) exit(0); 51 return up == '-' ? -num : num; 52 } 53 54 int depMax, winned; 55 int tot; 56 int map[N]; 57 std::vector <int> V; 58 59 inline void move(char c){ 60 register int ic = c - 'A'; 61 register int temp = map[moveNext[ic][0]]; 62 for(register int i = 0; i < 6; i++) 63 map[moveNext[ic][i]] = map[moveNext[ic][i + 1]]; 64 map[moveNext[ic][6]] = temp; 65 return; 66 } 67 68 inline void win(){ 69 puts(nos); 70 printf("%d\n", map[7]); 71 return; 72 } 73 74 inline bool check(){ 75 register int basic = map[checkX[0]]; 76 for(register int i = 1; i <= 7; i++){ 77 if(basic != map[checkX[i]]) 78 return 0; 79 } 80 return 1; 81 } 82 83 inline void gotWin(){ 84 for(std::vector <int> ::iterator it = V.begin(); it < V.end(); ++it) 85 printf("%c", 'A' + *it); 86 puts(""); 87 printf("%d\n", map[7]); 88 return; 89 } 90 91 inline int least(){ 92 int cnt[4] = {0, 0, 0, 0}; 93 for(int i = 0; i < 8; i++) 94 ++cnt[map[checkX[i]]]; 95 return 8 - std::max (cnt[1], std::max (cnt[2], cnt[3])); 96 } 97 98 void DFS(int dep, int last){ 99 if(dep > depMax) return; 100 if(check()){ 101 gotWin(); 102 winned = 1; 103 return; 104 } 105 for(int i = 0; i <= 7 && winned == 0; i++){ 106 if(i == back[last]) continue; 107 int must = least(); 108 if(must + dep > depMax) continue; 109 move(i + 'A'); 110 V.push_back(i); 111 DFS(dep + 1, i); 112 V.pop_back(); 113 move(back[i] + 'A'); 114 } 115 return; 116 } 117 118 inline void IDDFS(){ 119 depMax = 0; 120 while(winned == 0){ 121 ++depMax; 122 tot = winned = 0; 123 DFS(0, 9); 124 } 125 V.clear(); 126 winned = 0; 127 return; 128 } 129 130 inline int main(){ 131 while(scanf("%d", &map[1])){ 132 if(map[1] == 0) return 0; 133 for(register int i = 2; i <= 24; i++) 134 map[i] = read(); 135 if(check()) win(); 136 else IDDFS(); 137 } 138 return 0; 139 } 140 141 }//namespace chino 142 143 signed main(){return chino::main();}