您的位置:首页 > 其它

mayan 游戏 search

2016-11-08 11:19 357 查看
纯搜索,,,模拟,,还不算太难,,就是细节略繁琐
  首先因为题目要求保证字典序,所以显然把右边的块换到左边不如把左边的块换到右边优,
所以可以进行不小规模的剪枝,之后显然交换两块相同的色块没有意义,至此基本可以通过,在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
4000
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 */


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: