搜索+自行模拟,注意边界情况限制xy的范围
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
using namespace std;
int m,n;
char color[55][55];
bool b[55][55];
void pushdown()
{
for(int i=1;i<=n;i++)
{
int p=m;
for(int j=m;j>=1;j--)
{
if(color[j][i]!=' ')
{
char c=color[j][i];
color[j][i]=' ';
color[p][i]=c;
p--;
}
}
}
}
void write()
{
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cout<<color[i][j];
}
cout<<endl;
}
cout<<"*********************"<<endl;
}
bool f()
{
bool ok=false;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(j+2<=n&&color[i][j]==color[i][j+1]&&color[i][j+1]==color[i][j+2]&&color[i][j]!=' ')
{
b[i][j]=true;
b[i][j+1]=true;
b[i][j+2]=true;
ok=true;
}
if(i+2<=m&&color[i][j]==color[i+1][j]&&color[i+1][j]==color[i+2][j]&&color[i][j]!=' ')
{
b[i][j]=true;
b[i+1][j]=true;
b[i+2][j]=true;
ok=true;
}
if((i+2<=m&&j+2<=n)&&color[i][j]==color[i+1][j+1]&&color[i][j]==color[i+2][j+2]&&color[i][j]!=' ')
{
b[i][j]=true;
b[i+1][j+1]=true;
b[i+2][j+2]=true;
ok=true;
}
if(i<=m-2&&j>=2&&color[i][j]==color[i+1][j-1]&&color[i][j]==color[i+2][j-2]&&color[i][j]!=' ')
{
b[i][j]=true;
b[i+1][j-1]=true;
b[i+2][j-2]=true;
ok=true;
}
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(b[i][j]==true)
{
color[i][j]=' ';
}
}
}
// write();
memset(b,false,sizeof(b));
if(ok==false) return false;
else
{
pushdown();
//write();
return true;
}
}
int main()
{
cin>>m>>n;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cin>>color[i][j];
}
}
while(f()==true);
pushdown();
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cout<<color[i][j];
}
cout<<endl;
}
return 0;
}