题解 P4420 【[COCI2017-2018#1] Tetris 】
简单的枚举
注意: 翻转九十度,五种俄罗斯方块有不同情况。 图一无变化。 图二,图三和图四有两种变化。 图五有四种变化。 但是数据水,可以else直接过,不需要考虑。
直接存在数组中,从头到尾扫描一遍。
#include<bits/stdc++.h>
using namespace std;
char s[11][11];
int sum[6],n,m,i,j;
void remove(int x,int y)
{
char c=s[x][y];
s[x][y]='.';
if(s[x-1][y]==c) remove(x-1,y);
if(s[x+1][y]==c) remove(x+1,y);
if(s[x][y-1]==c) remove(x,y-1);
if(s[x][y+1]==c) remove(x,y+1);
}
int check(int x,int y)
{
char c=s[x][y];
if(s[x+1][y]==c&&s[x+1][y+1]==c&&s[x][y+1]==c)
return 1;
if((s[x][y+1]==c&&s[x][y+2]==c&&s[x][y+3]==c)||(s[x+1][y]==c&&s[x+2][y]==c&&s[x+3][y]==c))
return 2;
if((s[x][y+1]==c&&s[x+1][y]==c&&s[x+1][y-1]==c)||(s[x+1][y]==c&&s[x+1][y+1]==c&&s[x+2][y+1]==c))
return 3;
if((s[x][y+1]==c&&s[x+1][y+1]==c&&s[x+1][y+2]==c)||(s[x+1][y]==c&&s[x+1][y-1]==c&&s[x+2][y-1]==c))
return 4;
else
return 5;
}
int main()
{
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>s[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(s[i][j]!='.')
{
sum[check(i,j)]++;
remove(i,j);
}
for(i=1;i<=5;i++)
cout<<sum[i]<<endl;
return 0;
}```