题解 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;
}```