当前位置 博文首页 > xcc1220的博客:摩天大楼问题

    xcc1220的博客:摩天大楼问题

    作者:[db:作者] 时间:2021-09-13 16:15

    前几天呢,一位小老弟给我分享了这道很有意思的题目,可是捏,我找遍了网络,也没有找到这个题的题解,于是乎,余勇当此题拓荒者也!

    来人哪,把题目献上来!

    题目描述

    摩天大楼是日本人创作的游戏。 它于1992年在纽约举行的第一届世界益智冠军赛上获得了首次广泛曝光,当时发行商Sekai Bunka-sha向竞争对手介绍了他们的《 Puzzer》杂志。 在美国,Kevin Stone对其进行了增强。
    该游戏如下所示:在每个正方形中放置一个高度为1到5的摩天大楼,该行中任意两个摩天大楼的高度都不相同。输入的值共两个,分别是从左右能看到的大楼数量(高楼会挡住底楼哦)。

    在上面的示例中,从左侧看,可以看到4座摩天大楼:#2,#3,#4和#5。 #1被#3阻挡。 从右侧看,只能看到一个摩天大楼。 #5阻止所有其他大楼。 因此,左侧的数据为4,右侧的数据为1。

    输入描述

    共一行输入,表示从左侧和从右侧看到的大楼数量。

    输出描述

    共一行,输出有几种摆放的情况可以满足输入。

    样例

    输入

    1 2

    输出

    6
    

    其实这个题说难也不难,简直可以约等于简单。这个题乍一看蛮唬人的,但是如果你仔细想想,就会发现这个题,不就是个模拟算法的题吗?真是《简单极了》!(话虽这么说,本蒟蒻想了不下四十分钟)因为这个题没有什么规律可言,所以说只能根据提描述来列举出所有情况进行模拟,过程如下:
    列举1-5个楼高的所有排列方式。
    判断从右往左可以看到几个楼。
    判断从左往右可以看到几个楼。

    判断左右测看到的楼高是否符合要求,符合则计数。

    所以,上代码!

    #include<iostream>
    using namespace std;
    int main(){
        int a[6],l,r,sum=0;
        cin>>l>>r;
        for(int i=1;i<=5;i++){
        for(int j=1;j<=5;j++){
        for(int k=1;k<=5;k++){
        for(int m=1;m<=5;m++){
        for(int n=1;n<=5;n++){
            if(i!=j&&i!=k&&i!=m&&i!=n&&j!=k&&j!=m&&j!=n&&k!=m&&k!=n&&m!=n){
                int suml=1,sumr=1;
                a[1]=i,a[2]=j,a[3]=k,a[4]=m,a[5]=n;
                int ll=a[1],rr=a[5];
                for(int ii=1;ii<=5;ii++){
                    if(a[ii]>ll){
                        suml++;
                        ll=a[ii];
                    }
                }
                for(int ii=5;ii>=1;ii--){
                    if(a[ii]>rr){
                        sumr++;
                        rr=a[ii];
                    }
                }
                if(suml==l&&sumr==r){
                    sum++;
                }
            }
        }
        }
        }
        }
        }
        cout<<sum;
    }

    最后想弱弱问一句,有没有更简洁的方法(值代码行数少)?

    cs
    下一篇:没有了