题目描述
含有n行m列的棋盘上,棋盘的每个格子都有一种颜色的棋子。当一行或一列 上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。
Input
第一行两个数n,m
接下来n行m列,每个数字代表棋子颜色(大于0)
Output
输出n行m列,代表消除后的棋盘,被消除的位置输出0。以空格隔开
解题思路
消除并不难,主要是保证一点:先全部判断完,再一并消除。因为如果边判断边消除,可能存在某个位置,其所在行列都能被消除,但如果先按照行(或列)消除,置为0;则另一个进行判断时,就会无法判断是否满足消除条件,从而无法进行消除。
因此用一个bool数组f[][],来标识当前某个位置是否已经判断消除,如果该消除,则f置为1,否则为0,最后根据f的内容,将所有为1的位置,对应棋子全部改为0,其余不变,输出即可。
实现代码
#include<iostream>
using namespace std;
int a[32][32],n,m;
bool f[32][32];
void judge(int i,int j)
{
if(i==1||i==n)
{
if(j==1||j==m)
return;
if(a[i][j]==a[i][j-1]&&a[i][j]==a[i][j+1])
{
f[i][j-1]=1;
f[i][j]=1;
f[i][j+1]=1;
return;
}
}
else if(j==1||j==m)
{
if(a[i-1][j]==a[i][j]&&a[i][j]==a[i+1][j])
{
f[i-1][j]=1;
f[i][j]=1;
f[i+1][j]=1;
return;
}
}
else
{
if(a[i][j]==a[i][j-1]&&a[i][j]==a[i][j+1])
{
f[i][j-1]=1;
f[i][j]=1;
f[i][j+1]=1;
}
if(a[i-1][j]==a[i][j]&&a[i][j]==a[i+1][j])
{
f[i-1][j]=1;
f[i][j]=1;
f[i+1][j]=1;
}
}
return;
}
void change()
{
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
if(f[i][j]==1)
a[i][j]=0;
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
cin>>a[i][j];
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
judge(i,j);
}
change();
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
cout<<a[i][j];
if(j!=m)
cout<<" ";
}
if(i!=n)
cout<<endl;
}
return 0;
}
总结
难度同样不大,需要考虑到满足多行列消除条件的位置,考虑到特殊情况,就能采用合理的方式进行处理,保证得到满分。