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 */