有时候思考一个问题,要多以计算机的角度思考
也许一个一个点的判断过程看起来很”笨“,但是正常思维的”先判断整一串是否要消除,再来消除“的代码实现更加繁琐
解题思路
该题数据范围不大,可以采用纯模拟暴力解题判断这一连串是否要消除可以思考成当前该点是否应该消除从该点上下左右移动指针,当数值相等时,指针移动,通过指针间距判断是否满足三个及以上相等
代码实现
#include#include #include using namespace std; const int N = 35; int n, m; int a[N][N]; bool b[N][N]; int main() { cin >> n >> m; for (int i = 0; i < n; i ++) { for (int j = 0; j < m; j ++) { cin >> a[i][j]; } } //遍历每一个点,判断其是否会被消除 for (int i = 0; i < n; i ++) { for (int j = 0; j < m; j ++) { int z = j, y = j, s = i, x = i; //设立四个指针 while (z >= 0 && a[i][z] == a[i][j]) z --; //结束循环时,指针指向当前第一个不满足条件的位置 while (y < m && a[i][y] == a[i][j]) y ++; while (s >= 0 && a[s][j] == a[i][j]) s --; while (x < n && a[x][j] == a[i][j]) x ++; if (y - z >= 4 || x - s >= 4) b[i][j] = true; //例如3,4,5这三个空格恰好同色,那么当前指针z = 2, y = 6,所以应该>= 4 //当其左右或上下有连续三个及以上相同时,则该点会被消除 } } for (int i = 0; i < n; i ++) { for (int j = 0; j < m; j ++) { if (!b[i][j]) cout << a[i][j] << " "; else cout << 0 << " "; } cout << endl; } return 0; }



