AcWing 3223. 消除类游戏
原题链接
简单
作者:
syl
,
2021-03-16 16:48:27
,
所有人可见
,
阅读 513
C++ 代码
/*
复杂度: 900 * (30+30+30+30+30+30) = 900*180 <1e8
*/
#include<bits/stdc++.h>
using namespace std;
const int N = 35;
int n,m;
int a[N][N];
bool st[N][N]; //标记数组,把能消除得方块先置为true
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++){
int l,r,b,t;
l = r = j;
b = t = i;
while(l>=1 && a[i][l-1]==a[i][j]) l--;
while(r<=n && a[i][r+1]==a[i][j]) r++;
while(t>=1 && a[t-1][j]==a[i][j]) t--;
while(b<=n && a[b+1][j]==a[i][j]) b++;
//重复方块数>=3,进行标记
//我们不能改变原数组,若改变原数组,则可能会影响下一行的判断
if(r-l+1>=3){
for(int k=l;k<=r;k++) st[i][k] = true;
}
if(b-t+1>=3){
for(int k=t;k<=b;k++) st[k][j] = true;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(st[i][j]){
a[i][j] = 0;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}