结果是正确的,但是超时了,1.062s,只有50分,目前不知道怎么在递归的前提下优化,大家可以提提建议,网上的都是常规做法,这里用递归算是提供一种新思路
#include <iostream>
using namespace std;
int direct[5][2]= {{0,1},{1,0}};//列 行
const int N=100;
const int M=100;
int a[N][M];
int n,m;
int flag[N][M]={0};
void Clean(int i,int j)
{
if(i>n||j>m)return;
if(i<n-2&&a[i][j]==a[i+1][j]&&a[i][j]==a[i+2][j])//先判断列有没有三个
{
flag[i][j]=1;
flag[i+1][j]=1;
flag[i+2][j]=1;
}
if(j<m-2&&a[i][j]==a[i][j+1]&&a[i][j]==a[i][j+2])//再判断行有没有三个
{
flag[i][j]=1;
flag[i][j+1]=1;
flag[i][j+2]=1;
}
for(int k=0; k<2; ++k) //递归处理右下2个周边坐标
Clean(i+direct[k][0],j+direct[k][1]);//先列再行
}
int main()
{
cin>>n>>m;
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
cin>>a[i][j];
int i=0,j=0;
Clean(i,j);
for(i=0; i<n; i++)
{
for( j=0; j<m; j++)
{
if(flag[i][j]==1)
a[i][j]=0;
cout << a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}