mayan 游戏 search

纯搜索,,,模拟,,还不算太难,,就是细节略繁琐
  首先因为题目要求保证字典序,所以显然把右边的块换到左边不如把左边的块换到右边优,
所以可以进行不小规模的剪枝,之后显然交换两块相同的色块没有意义,至此基本可以通过,在clear过程中最好对即将删除的色块打标记再统一删除,以避免出现意外情况,同时每次clear之后要在进行fall处理,因为每次操作可能引发连锁反应
  两次没过样例, 第一次手抖把x 打成了x + 1, 第二次写fall时忘记将之前落下的删掉
  WA掉一次,读入时以为每行最多7个数,忘记考虑结尾的0
  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 //#define debug
  5 //#define debug2
  6 
  7 const int maxn = 10;
  8 int n;
  9 int m[maxn][maxn][maxn];
 10 int f[maxn][maxn];
 11 int ans[100][3];
 12 
 13 bool cl(int x) {
 14     memset(f, 0, sizeof(f));
 15     for (int i = 1; i <= 5; i++)
 16         for (int j = 1; j <= 7; j++) {
 17             if (m[x][i][j] == 0) break;
 18             if (f[i][j] != 1 && i > 2 && m[x][i-2][j] == m[x][i][j] && m[x][i-1][j] == m[x][i][j]) {
 19                 f[i-2][j] = 1;
 20                 f[i-1][j] = 1;
 21                 f[i][j] = 1;
 22                 int cur = i + 1;
 23                 while (cur <= 5 && m[x][cur][j] == m[x][i][j]) {
 24                     f[cur][j] = 1;
 25                     cur++;
 26                 }
 27                 cur = i - 3;
 28                 while (cur > 0 && m[x][cur][j] == m[x][i][j]) {
 29                     f[cur][j] = 1;
 30                     cur--;
 31                 }
 32             }
 33             if (f[i][j] != 2 && j > 2 && m[x][i][j-2] == m[x][i][j] && m[x][i][j-1] == m[x][i][j]) {
 34                 f[i][j-2] = 1;
 35                 f[i][j-1] = 1;
 36                 f[i][j] = 1;
 37                 int cur = j + 1;
 38                 while (cur <= 7 && m[x][i][cur] == m[x][i][j]) {
 39                     f[i][cur] = 2;
 40                     cur++;
 41                 }
 42                 cur = j - 3;
 43                 while (cur > 0 && m[x][i][cur] == m[x][i][j]) {
 44                     f[i][cur] = 2;
 45                     cur--;
 46                 }
 47             }
 48         }
 49     bool is_c = 0;
 50     for (int i = 1; i <= 5; i++)
 51         for (int j = 1; j <= 7; j++) {
 52             if (f[i][j] > 0) {
 53                 is_c = 1;
 54                 m[x][i][j] = 0;
 55             }
 56         }
 57     return (is_c);
 58 }
 59 
 60 void fall(int x) {
 61     for (int i = 1; i <= 5; i++) {
 62         int cur = 0;
 63         for (int j = 1; j <= 7; j++) {
 64             if (m[x][i][j] > 0) {
 65                 cur++;
 66                 m[x][i][cur] = m[x][i][j];
 67                 if (j != cur) m[x][i][j] = 0;
 68             } 
 69         }
 70     }
 71 }
 72 
 73 void dfs(int x) {
 74 #ifdef debug
 75     for (int i = 1; i <= n; i++) {
 76         printf("%d %d %d\n", ans[i][0], ans[i][1], ans[i][2]);
 77     }
 78     printf("\n\n");
 79 #endif 
 80 #ifdef debug2
 81     if (ans[1][0] == 3 && ans[1][1] == 0 && ans[1][2] == 1) {
 82         printf("kkk\n");
 83     }
 84 #endif 
 85     if (x == n + 1) {
 86         fall(x);
 87         cl(x);
 88         fall(x);
 89         while (cl(x)) fall(x);
 90         for (int i = 1; i <= 5; i++) 
 91             for (int j = 1; j <= 7; j++) {
 92                 if (m[x][i][j] > 0) return;
 93             }
 94         for (int i = 1; i <= n; i++) {
 95             printf("%d %d %d\n", ans[i][0], ans[i][1], ans[i][2]);
 96         }
 97         exit(0);
 98     }
 99     for (int i = 1; i <= 5; i++) 
100         for (int j = 1; j <= 7; j++) {
101             if (m[x][i][j] == 0) continue;
102             if (i < 5 && m[x][i+1][j] == 0) {
103                 memcpy(m[x+1], m[x], sizeof(m[x]));
104                 m[x+1][i+1][j] = m[x][i][j];
105                 m[x+1][i][j] = 0;
106                 fall(x + 1);
107                 while (cl(x + 1)) fall(x + 1);
108                 ans[x][0] = i - 1;
109                 ans[x][1] = j - 1;
110                 ans[x][2] = 1;
111                 dfs(x + 1);
112             } 
113             if (i < 5 && m[x][i+1][j] > 0 && m[x][i+1][j] != m[x][i][j]) {
114                 memcpy(m[x+1], m[x], sizeof(m[x]));
115                 m[x+1][i+1][j] = m[x][i][j];
116                 m[x+1][i][j] = m[x][i+1][j];
117                 fall(x + 1);
118                 while (cl(x + 1)) fall(x + 1);
119                 ans[x][0] = i - 1;
120                 ans[x][1] = j - 1;
121                 ans[x][2] = 1;
122                 dfs(x + 1);
123             }  
124             if (i > 1 && m[x][i-1][j] == 0) {
125                 memcpy(m[x+1], m[x], sizeof(m[x]));
126                 m[x+1][i-1][j] = m[x][i][j];
127                 m[x+1][i][j] = 0;
128                 fall(x + 1);
129                 while (cl(x + 1)) fall(x + 1);
130                 ans[x][0] = i - 1;
131                 ans[x][1] = j - 1;
132                 ans[x][2] = -1;
133                 dfs(x + 1);
134             }
135         }
136 }
137 
138 int main () {
139     scanf("%d", &n);
140     for (int i = 1; i <= 5; i++) {
141         for (int j = 1; j <= 8; j++) {
142             scanf("%d", &m[1][i][j]);
143             if (m[1][i][j] == 0) break;
144         }
145     }
146     dfs(1);
147     printf("-1\n");
148     return 0;
149 }
150 
151 /*
152 1
153 1 0
154 2 1 0
155 2 1 4 0
156 3 4 0
157 2 3 3 4 0
158 */

 

posted @ 2016-10-23 20:07  CtsNevermore  阅读(178)  评论(0编辑  收藏  举报