Logo S08577 的博客

博客

P6480 [CRCI2006-2007] TETRIS 题解

...
S08577
2025-12-01 12:57:30

本文章由 WyOJ Shojo 从洛谷专栏拉取,原发布时间为 2024-04-20 14:56:26

一眼大模拟。

题意

不多说了

生动形象的题意

思路

题目中已经告诉了俄罗斯方块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;
    }

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

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。