代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int n, m;
cin >> n >> m;
int a[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-2; j++){
if ((abs(a[i][j]) == abs(a[i][j+1])) && abs(a[i][j+1]) == abs(a[i][j+2])){
if (a[i][j] > 0) a[i][j] = a[i][j] * (-1);
if (a[i][j+1] > 0) a[i][j+1] = a[i][j+1] * (-1);
if (a[i][j+2] > 0) a[i][j+2] = a[i][j+2] * (-1);
}
}
}
for (int i=0; i<n-2; i++){
for (int j=0; j<m; j++){
if ((abs(a[i][j]) == abs(a[i+1][j])) && abs(a[i+1][j]) == abs(a[i+2][j])){
if (a[i][j] > 0) a[i][j] = a[i][j] * (-1);
if (a[i+1][j] > 0) a[i+1][j] = a[i+1][j] * (-1);
if (a[i+2][j] > 0) a[i+2][j] = a[i+2][j] * (-1);
}
}
}
for (int i=0; i<n; i++){
for (int j=0; j<m; j++){
if (a[i][j] < 0){
cout << 0 << " ";
}else{
cout << a[i][j] << " ";
}
}
cout << endl;
}
return 0;
}
核心思路
1、重复标记
- 使用原数组,重复标记为负数,用绝对值判断比较,根据原数组输出
- 额外开一个数组,初始都是0, 要清除的标记为-1,最后根据这个数组输出
2、处理过程
- 先逐行标记"清除"的数,再逐列标记每列要"清除"的数,这样就完成一个棋盘所有要清除数的标记,所以整体代码会分成两部分,即行和列, 二者思路完全一致。
- 注意数组下标不要越界。