• 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
    ", ans[i][0], ans[i][1], ans[i][2]);
     77     }
     78     printf("
    
    ");
     79 #endif 
     80 #ifdef debug2
     81     if (ans[1][0] == 3 && ans[1][1] == 0 && ans[1][2] == 1) {
     82         printf("kkk
    ");
     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
    ", 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
    ");
    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 */
  • 相关阅读:
    hibernate 数据处理
    oracle函数
    TCP聊天工具
    Hibernate批量处理数据、HQL连接查询
    Hibernate二级缓存配置
    Hibernate一对一关联映射配置
    Hibernate延迟加载
    Hibernate双向多对多关联
    06章 映射一对多双向关联关系、以及cascade、inverse属性
    映射对象标识符
  • 原文地址:https://www.cnblogs.com/CtsNevermore/p/5990835.html
Copyright © 2020-2023  润新知