#include using namespace std;

const int MAXN = 10; // 方块最大数量 const int MAXM = 10; // 方块最大数量

int n, m; // 方块数量 int a[MAXN][MAXM]; // 存储方块 bool vis[MAXN][MAXM]; // 标记方块是否被访问过

// 判断两个方块是否可以被消除 bool can_remove(int x1, int y1, int x2, int y2) { if (a[x1][y1] != a[x2][y2]) { return false; // 两个方块不相同,不能消除 } if (x1 == x2 && y1 == y2) { return false; // 同一个方块,不能消除 } if (x1 == x2) { // 横向连通,检查中间是否有障碍物 bool flag = true; for (int i = min(y1, y2) + 1; i < max(y1, y2); i++) { if (a[x1][i] != 0) { flag = false; break; } } return flag; } else if (y1 == y2) { // 纵向连通,检查中间是否有障碍物 bool flag = true; for (int i = min(x1, x2) + 1; i < max(x1, x2); i++) { if (a[i][y1] != 0) { flag = false; break; } } return flag; } else { // 不是横向或纵向连通,不能消除 return false; } }

// 搜索连通块 bool search(int x1, int y1, int x2, int y2) { if (x1 < 0 || x1 >= n || y1 < 0 || y1 >= m) { return false; // 越界 } if (x2 < 0 || x2 >= n || y2 < 0 || y2 >= m) { return false; // 越界 } if (vis[x1][y1] || vis[x2][y2]) { return false; // 已经被访问过 } if (!can_remove(x1, y1, x2, y2)) { return false; // 不能被消除 } vis[x1][y1] = true; vis[x2][y2] = true; if (x1 == x2 && y1 == y2) { return true; // 成功消除 } // 横向搜索 for (int i = 0; i < n; i++) { if (can_remove(x1, y1, i, y2) && search(x1, y1, i, y2)) { return true; } if (can_remove(i, y1, x2, y2) && search(i, y1, x2, y2)) { return true; } } // 纵向搜索 for (int i = 0; i < m; i++) { if (can_remove(x1, y1, x2, i) && search(x1, y1, x2, i)) { return true; } if (can_remove(x1, i, x2, y2) && search(x1, i, x2, y2)) { return true; } } vis[x1][y1] = false; vis[x2][y2] = false; return false; }

// 尝试消除这两个方块,并返回是否成功消除 bool remove(int x1, int y1, int x2, int y2) { if (can_remove(x1, y1, x2, y2)) { a[x1][y1] = a[x2][y2] = 0; memset(vis, false, sizeof(vis)); return search(x1, y1, x2, y2); } else { return false; } }

int main() { // 读入方块数量和方块数据 cin >> n >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> a[i][j]; } } // 循环尝试消除相邻的两个方块 bool flag = true; while (flag) { flag = false; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (a[i][j] != 0) { for (int k = i; k < n; k++) { for (int l = (k == i ? j + 1 : 0); l < m; l++) { if (a[k][l] != 0 && remove(i, j, k, l)) { // 成功消除 flag = true; break; } } if (flag) { break; } } } if (flag) { break; } } if (flag) { break; } } } // 输出结果 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cout << a[i][j] << " "; } cout << endl; } return 0;

C++ 连连看小游戏方块消除代码示例

原文地址: http://www.cveoy.top/t/topic/oCma 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录