当前位置:首页 » 《资源分享》 » 正文

摩天大楼问题_xcc1220的博客

15 人参与  2021年10月02日 13:43  分类 : 《资源分享》  评论

点击全文阅读


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

来人哪,把题目献上来!

题目描述

摩天大楼是日本人创作的游戏。 它于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;
}

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


点击全文阅读


本文链接:http://zhangshiyu.com/post/29207.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1