Week12 CSP-M3 B

思路:

暴力搜索即可,先搜行,再搜列,需要消除的就打标记,最后按标记输出,有标记就输出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;
}

  

原文地址:https://www.cnblogs.com/qingoba/p/13051001.html