P6480 [CRCI2006-2007] TETRIS 题解

· · 题解

一眼大模拟。

题意

不多说了

生动形象的题意

思路

题目中已经告诉了俄罗斯方块7种形状。想要让任何一列只有底部连续若干行有方块,我们需要分类讨论。

1

分两种情况,横放和竖放。

竖放

竖放在哪一列放都行。

横放

横放需要有四个连续相等的高度。

    if(m==1){
        for(int i=1;i<=n-3;i++){
            if(a[i]==a[i+1]&&a[i+1]==a[i+2]&&a[i+2]==a[i+3]){
                cnt++;
            }

        }
        cout<<cnt+n;
    }

2

我们发现横放和竖放都是一种图形。

横放+竖放

需要两个连续相等的高度

    if(m==2){
        for(int i=1;i<n;i++){
            if(a[i]==a[i+1]){
                cnt++;
            }

        }
        cout<<cnt;
    }

3

分横放和竖放。

横放

横放需要前两个高度相等,第三个比第二个高 1

竖放

竖放第一个比第二个高 1

    if(m==3){
        for(int i=1;i<=n-2;i++){
            if(a[i]==a[i+1]&&a[i+2]-a[i+1]==1){
                cnt++;
            }

        }
        for(int i=1;i<=n-1;i++){
            if(a[i]-a[i+1]==1){
                cnt++;
            }

        }
        cout<<cnt;
    }

4

3 几乎一样,不过方向反了。

    if(m==4){
        for(int i=1;i<=n-2;i++){
            if(a[i+2]==a[i+1]&&a[i]-a[i+1]==1){
                cnt++;
            }

        }
        for(int i=1;i<=n-1;i++){
            if(a[i+1]-a[i]==1){
                cnt++;
            }

        }
        cout<<cnt;
    }

5

分正放,竖放,倒放,

正放

正放需要三个相同的高度。

竖放

竖放分两种情况

顺时针90°

第二个比第一个高 1

逆时针90°

第一个比第二个高 1

倒放

第二个比第一个和第三个少 1

    if(m==5){
        for(int i=1;i<=n-2;i++){//正放
            if(a[i]==a[i+1]&&a[i+1]==a[i+2]){
                cnt++;
            }

        }
        for(int i=1;i<=n-1;i++){//逆时针90
            if(a[i]-a[i+1]==1){
                cnt++;
            }

        }
        for(int i=1;i<=n-1;i++){//顺时针90
            if(a[i]-a[i+1]==-1){
                cnt++;
            }

        }
        for(int i=1;i<=n-2;i++){//倒放
            if(a[i]-a[i+1]==1&&a[i+2]-a[i+1]==1){
                cnt++;
            }

        }
        cout<<cnt;
    }

6

分正放,竖放,倒放,

正放

正放需要三个相同的高度。

竖放

竖放分两种情况

顺时针90°

需要两个相同的高度

逆时针90°

第一个比第二个高 2

倒放

第一个比第二个和第三个少 1

   if(m==6){
        for(int i=1;i<=n-2;i++){
            if(a[i]==a[i+1]&&a[i+1]==a[i+2]){
                cnt++;
            }

        }
        for(int i=1;i<=n-1;i++){
            if(a[i]-a[i+1]==2){
                cnt++;
            }

        }
        for(int i=1;i<n;i++){
            if(a[i]==a[i+1]){
                cnt++;
            }

        }
        for(int i=1;i<=n-2;i++){
            if(a[i]-a[i+1]==-1&&a[i+2]-a[i+1]==0){
                cnt++;
            }

        }
        cout<<cnt;
    }

7

分正放,竖放,倒放,

正放

正放需要三个相同的高度。

竖放

竖放分两种情况

顺时针90°

第二个比第一个高 2

逆时针90°

需要两个相同的高度。

倒放

第三个比一个和第二个少 1

 if(m==7){
        for(int i=1;i<=n-2;i++){
            if(a[i]==a[i+1]&&a[i+1]==a[i+2]){
                cnt++;
            }

        }
        for(int i=1;i<=n-1;i++){
            if(a[i]-a[i+1]==-2){
                cnt++;
            }

        }
        for(int i=1;i<n;i++){
            if(a[i]==a[i+1]){
                cnt++;
            }

        }
        for(int i=1;i<=n-2;i++){
            if(a[i]-a[i+1]==0&&a[i+2]-a[i+1]==-1){
                cnt++;
            }

        }
        cout<<cnt;
    }

创作不易,请三连(关注作者+点赞+收藏),感激不尽。