[poj]The Rotation Game

迭代加深搜索

原题:poj-The Rotation Game


无限深度的搜索 , 选择迭代加深

每搜完一次 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();}

猜你喜欢

转载自www.cnblogs.com/chiarochinoful/p/problem-poj-2286.html