一、问题链接
二、思路
模拟
注意:指定vector的⼤⼩时,要稍微大一些,若仅仅指定N * M,会造成运行时错误。
三、参考代码
#include<bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin>>n>>m;
vector<vector<int>> a(n+10,vector<int>(m+10));//保留未消除的序列
vector<vector<int>> b(n+10,vector<int>(m+10));//保留行消除后的序列
vector<vector<int>> c(n+10,vector<int>(m+10));//保留列消除后的序列
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
cin>>a[i][j];
b[i][j]=a[i][j];
c[i][j]=a[i][j];
}
}
//count记录元素重复个数
//first指向重复第一个元素,last指向重复的最后一个元素
int count,first,last;
//处理行
for(int i=0; i<n; i++) {
for(int j=0; j<m-1; j++) {
count = 1;
first=a[i][j];
last=a[i][j+1];
while(first==last) {
count++;
if(j<m-1) j++;//如果没到最后一列
else break;
last=a[i][j+1];//指向下一列元素
}
if(count>=3) {
for(int k=0; k<count; k++) {
b[i][j-k]=0;//一行中三个以上相同元素归零
}
}
}
}
//处理列
for(int j=0; j<m; j++) {
for(int i=0; i<n-1; i++) {
count = 1;
first=a[i][j];
last=a[i+1][j];
while(first==last) {
count++;
if(i<n-1) i++;//如果没到最后一行
else break;
last=a[i+1][j];//指向下一行元素
}
if(count>=3) {
for(int k=0; k<count; k++) {
c[i-k][j]=0;
}
}
}
}
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
(b[i][j]==0 || c[i][j]==0) ? cout<<"0" : cout<<a[i][j];
cout<<" ";
}
cout<<"\n";
}
return 0;
}