前几天呢,一位小老弟给我分享了这道很有意思的题目,可是捏,我找遍了网络,也没有找到这个题的题解,于是乎,余勇当此题拓荒者也!
来人哪,把题目献上来!
题目描述
摩天大楼是日本人创作的游戏。 它于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;
}
最后想弱弱问一句,有没有更简洁的方法(值代码行数少)?