九连环

Regan-lin 2015-03-25 10:50:26
加精
面试的时候,碰到最后一道题,如下:

一开始我以为这是他们公司自己出的道普通的算法题,就没有多想,就画了图,把代码补充完整,代码如下:
UpAll(n)
{
if(n==1) UpOne(1);
else if(n==2) UpOne(1);UpOne(2);
else UpAll(n-1) DownAll(n-2);UpOne(n);
}
本来做完就好了,但是回过头去看那条件的时候,我就发现很纠结(个人有很强的强迫症),一根棒子串过环,而且还是按顺序的串起来,那怎么可能做到前面还有环的时候,还可以取下后面的环(本屌之前没有听说过九连环这玩具,更别说它是怎么玩的了),思来前后,实在受不了,叫HR过来,想问问出题的技术总监,这题是不是他们自己出,我感觉这题有问题,想聊聊,但是HR说总监没在,说题没有问题,迫于坚持真理的情况下,我把上面写的代码划掉,如上图所看到的,我只写了:基于理性,我实在是无法想象怎么在没有去掉前环的情况下,取掉后面的环!这就和我当初读书考试写作文的时候,一直鸟穿越太平洋,请发挥你的想象力,写一篇不少于800字的作文,请试想一下你让一个理科生如何接受一只鸟能横穿太平洋,那次作文我也只答了:无法想象一只鸟能穿越太平洋,违法了常理!这些不按常理出牌的东西,让我这个理科生很是难受,也不会去接受!
于是面试完我回来查了下九连环,百度了下,原来是真的存在的东西,当时吓尿,世界三大智力玩具之一,好叼,玩法也和上面的介绍的一样,要取下或者装上n,那么n-1必须在且n-2必须取下,真是涨见识了,中国发明的东西真是高深莫测,又再一次毁了我的理念观,特来发此贴,让大家知道我们中国人的智力不是常理能够解释的!像中国的智力玩具-----九连环致敬!
其实九连环的算法十分简单,我这也简单介绍,网上也有了,按上面的题,你画个图就可以清楚得出思路要取掉这个九连环必须从最低层开始,也就是2或者3环开始,这就涉及到你要取环是单数还是双数,如果输入的双数,那你就从2环开始取下,如果是单数,那得从1环开始,所以,得先判断然后再递归,if(n==1) {DownOne(1)} else if(n==2) {DownOne(2);DownOne(1);}然后才是第3种情况开始的递归取,假设这个n是5,你要取掉5,那么你必须取掉5-2之前的环也就是第3个环,DownAll(n-2),现在5-1的环也就是4环还在,所以可以取掉5环也就是n,DownOne(n),那现在5环取掉了,接着就是取掉第4个环,要取掉第4个环就必须第3个环在,前2个环不在,现在前3个环不在,所以要UpAll(n-2),然后就是去下个环的参数了递归DownAll(n-1),这是取环的思路,装环的思路也和这个差不多,我这里就不多解释了,代码上面有,不过我没有经过检验,错了可以提出,我改,这里就不做多检验了。
完成代码:
DownAll(n)
{
if(n==1)DownOne(1);
else if(n==2){DownOne(2);DownOne(1);
else DownAll(n-2); DownOne(n); UpAll(n-2); DownAll(n-1);
}
UpAll(n)
{
if(n==1) UpOne(1);
else if(n==2) UpOne(1);UpOne(2);
else UpAll(n-1) DownAll(n-2);UpOne(n);
}
特此声明,我写此贴不是想吐槽面试,而是想多点人认识下中国的传统东西,不只是只要外国人的东西才考智力的,中国的东西也很博大精深的,希望可以看到多点这些把中国传统东西用代码解出来的帖子!好了,散分!
...全文
3881 98 打赏 收藏 转发到动态 举报
写回复
用AI写文章
98 条回复
切换为时间正序
请发表友善的回复…
发表回复
xl3783 2015-10-19
  • 打赏
  • 举报
回复
看上去很厉害的样子
runerback 2015-10-19
  • 打赏
  • 举报
回复
以前看别人玩就搞不懂,我觉得怎么都不可能全部拆下来
hercules135 2015-10-19
  • 打赏
  • 举报
回复
有点意思,没看到实物,无法想象怎么实现这样的东西,果断淘宝一下...好便宜...还包邮..
amwihfku 2015-04-13
  • 打赏
  • 举报
回复
自己写程序搞游戏~!厉害
ChanKalam 2015-04-13
  • 打赏
  • 举报
回复
没见过。。长知识了
_明月 2015-04-13
  • 打赏
  • 举报
回复
引用 83 楼 bbg2010 的回复:
[quote=引用 73 楼 dear_Alice_moon 的回复:] [quote=引用 43 楼 bbg2010 的回复:] 以前玩过九连环,拆装最快17分钟吧
嗯,百度百科上说这个世界纪录保持者用了237秒完成了九连环。哈哈[/quote] 没办法啊,开始拆或者装的时候还得想一想是不是先拆第一个还是第二个呢。有点笨,没办法[/quote] 嗯,都一样啦。不要说自己很笨的事情,我的学长交过我两次如何解九连环我自己还是不会,自己最多只能套两个环就在也套不下去了,呵呵。
sdshf2008 2015-04-12
  • 打赏
  • 举报
回复
太牛掰了 九连环迅速拆下 不知道你会不会玩,我会点九连环,可以教你大神!
luoxu666888 2015-04-12
  • 打赏
  • 举报
回复
qq_22042041 2015-04-12
  • 打赏
  • 举报
回复
好吊的样子 这叫一个大一的新生情何以堪
Rockyhu2015 2015-04-11
  • 打赏
  • 举报
回复
不错,值得学习!
qq_22042041 2015-04-10
  • 打赏
  • 举报
回复
帮你顶上去!!!!!
只为思考 2015-04-10
  • 打赏
  • 举报
回复
引用 73 楼 dear_Alice_moon 的回复:
[quote=引用 43 楼 bbg2010 的回复:] 以前玩过九连环,拆装最快17分钟吧
嗯,百度百科上说这个世界纪录保持者用了237秒完成了九连环。哈哈[/quote] 没办法啊,开始拆或者装的时候还得想一想是不是先拆第一个还是第二个呢。有点笨,没办法
_明月 2015-04-10
  • 打赏
  • 举报
回复
引用 83 楼 bbg2010 的回复:
[quote=引用 73 楼 dear_Alice_moon 的回复:] [quote=引用 43 楼 bbg2010 的回复:] 以前玩过九连环,拆装最快17分钟吧
嗯,百度百科上说这个世界纪录保持者用了237秒完成了九连环。哈哈[/quote] 没办法啊,开始拆或者装的时候还得想一想是不是先拆第一个还是第二个呢。有点笨,没办法[/quote] 呵呵,你很不错了,我自己玩九连环根本就玩不好啊,哈哈。
_明月 2015-04-10
  • 打赏
  • 举报
回复
引用 22 楼 Z65443344 的回复:
同没玩过 我只想知道,当n=2时,n-2=0,第0个环是什么鬼?
第零个环就是没有环,所以就不用去套环了。
潇潇雨云 2015-04-10
  • 打赏
  • 举报
回复
whatdoyousay 2015-04-10
  • 打赏
  • 举报
回复
为什么你们小时候都看过或者学过,我完全没有见过,而且题目也没看懂
jeck5000 2015-04-09
  • 打赏
  • 举报
回复
好难呀,还是吹笛子好
  • 打赏
  • 举报
回复
梦想小白菜 2015-04-07
  • 打赏
  • 举报
回复
iT-noob 2015-04-07
  • 打赏
  • 举报
回复
很厉害的样子
加载更多回复(71)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧