消除类游戏
from CCF-CSP 2015-12-2
Time limit:1s
Memory limit:256MB
分别按行按列进行处理,每一行或每一列只要有连续3个以上相等的数,就将其标记为需要消除。最后将所有需要消除的位置都改为0,然后输出即可。
ac代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,i,j,k;
int x[35][35];
bool note[35][35];
void row(){ //按行处理
for(i = 1;i <= n;++i) //对每一行进行处理
for(j = 1;j <= m - 2;++j){ //每一行都从第一个位置到最后一个位置进行遍历
int num = 1; //连续的个数
for(k = j + 1;k <= m;++k)
if(x[i][k] == x[i][j])
++num;
else
break;
if(num >= 3) //连续个数大于等于3时需要消除
for(int p = j;p < j + num;++p)
note[i][p] = true;
j = k - 1;
}
}
void col(){ //按列处理
for(j = 1;j <= m;++j) //对每一列进行处理
for(i = 1;i <= n - 2;++i){ //对每一列的每一个位置惊醒处理
int num = 1;
for(k = i + 1;k <= n;++k)
if(x[k][j] == x[i][j])
++num;
else
break;
if(num >= 3) //连续个数大于等于3时需要消除
for(int p = i;p < i + num;++p)
note[p][j] = true;
i = k - 1;
}
}
int main(){
cin>>n>>m;
for(i = 1;i <= n;++i)
for(j = 1;j <= m;++j)
cin>>x[i][j];
row(),col();
//将需要消除的地方标记为0
for(i = 1;i <= n;++i)
for(j = 1;j <= m;++j)
if(note[i][j])
x[i][j] = 0;
//输出
for(i = 1;i <= n;++i){
for(j = 1;j <= m;++j)
cout<<x[i][j]<<" ";
cout<<"\n";
}
return 0;
}