本题思路是按行和列分两次进行相邻数据比对,如果满足要求,则将其坐标记录。然后将坐标对应数值变为0即可。
具体代码如下:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//FILE *stream;
//freopen_s(&stream, "data.txt", "r", stdin);
int n, m;
cin >> n >> m;
vector<vector<int>> map(n);
vector<pair<int,int>> mark;
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
int temp;
cin >> temp;
map[i].push_back(temp);
}
}
for(int i = 0; i < n; i++) //按行比对
{
for(int j = 0, k; j < m - 2; j = k)
{
int same = 0;
for(k = j; k < m; k++)
{
if(map[i][j] == map[i][k]) same++;
else
{
if(same >= 3)
{
for(int l = j; l < k; l++) mark.push_back({i, l});
}
break;
}
if(k == m - 1 && same >= 3) //尾部处理
{
for(int l = j; l <= k; l++) mark.push_back({i, l});
}
}
}
}
for(int j = 0; j < m; j++) //按列比对
{
for(int i = 0, k; i < n - 2; i = k)
{
int same = 0;
for(k = i; k < n; k++)
{
if(map[i][j] == map[k][j]) same++;
else
{
if(same >= 3)
{
for(int l = i; l < k; l++) mark.push_back({l, j});
}
break;
}
if(k == n - 1 && same >= 3)
{
for(int l = i; l <= k; l++) mark.push_back({l, j});
}
}
}
}
for(auto e : mark)
{
map[e.first][e.second] = 0;
}
for(int i = 0; i < n; i++)
{
for(int j = 0; j < m; j++)
{
cout << map[i][j] << ' ';
}
cout << endl;
}
//fclose(stream);
return 0;
}