思路:
暴力搜索即可,先搜行,再搜列,需要消除的就打标记,最后按标记输出,有标记就输出0,没标记就正常输出
每一个点最多会被访问四次,最少被访问两次,上限复杂度O(4*N*M)
代码:
#include <cstdio> #include <iostream> #include <algorithm> #include <vector> using namespace std; int G[35][35]; int G2[35][35]; int main() { int N,M; cin>>N>>M; for(int i=1;i<=N;i++) for(int j=1;j<=M;j++) scanf("%d",&G[i][j]); //搜行 for(int i=1;i<=N;i++) { for(int l=1;l<=M;l++) { int r=0; for(r=l;r<=M;r++) { if(G[i][l]!=G[i][r]) break; } if(r-l>=3) //形成了连续的三个 { for(int k=l;k<=r-1;k++) G2[i][k]=1; } } } //搜列 for(int i=1;i<=M;i++) { for(int l=1;l<=N;l++) { int r=0; for(r=l;r<=M;r++) { if(G[l][i]!=G[r][i]) break; } if(r-l>=3) //形成了连续的三个 { for(int k=l;k<=r-1;k++) G2[k][i]=1; } } } //输出 for(int i=1;i<=N;i++) { for(int j=1;j<=M;j++) { if(G2[i][j]==1) printf(j==1 ? "0" : " 0"); else printf(j==1 ? "%d" : " %d",G[i][j]); } printf(" "); } return 0; }