今天去面试了一家知名公司面试题(C#编写),不会啊 求达人解答

r_yuan 2010-01-12 12:26:15
九连环是一种传统的中国玩具,它有九个连在一起的环河一根长棒组成。一开始,九个环都装在榜上,由于其特殊的构造,只能按以下规则从棒上取下或装上环:
1)所有环只能从棒的一端取下。将环按距离这一端的远近从近到远依次编号为1~9号环。无论知名移动环,环的顺序都不会改变
2)1号环随时可以取下或装上
3)当K-1(K=2-9)号之前的环(不包含K-1号环)全部被取下,K-1号环还在棒上时,可将K号环取下或装上

已有以下两个函数
UpOne(int idx);//装上某个序号的环(无法装上时不会有动作)
DownOne(int idx);//卸下某个序号的环(无法卸下时不会有动作)

请写出装上和卸下全部环的函数,并且将具体实现的C#代码写出(需用控制台输出)
...全文
793 69 打赏 收藏 转发到动态 举报
写回复
用AI写文章
69 条回复
切换为时间正序
请发表友善的回复…
发表回复
AnnanIn2008 2010-01-13
  • 打赏
  • 举报
回复
有点让我想起汉诺塔
nixiang12 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 62 楼 alifriend 的回复:]
微软那玩意儿我在公司用08的时候试过,不可尽信。就比如说有个窗体用到了DevExpress的控件,里面有很多控件自动生成的东西,微软说可维护度20,可我压根就没有代码……
[/Quote]

能告诉我是叫什么工具么 有点想法..谢谢了
绿色夹克衫 2010-01-13
  • 打赏
  • 举报
回复
所以我说圈复杂度,就是防止出现把所有内容放在1行的情况。
圈复杂度说的主要是if,while这类的循环和判断的嵌套。

不过话说远了,我的意思是如果九连环跟汉诺塔类似,应该可以用递归配合搜索来做。
代码会简洁不少,效率也并不会下降。

[Quote=引用 62 楼 alifriend 的回复:]
不好意思,我连测试数据、结果输出、UpOne、DownOne实现的代码全部贴上去了,而且这只是一时兴起写的,只保证结果而已。

话说回来,代码的行数并不能完全说明问题,你要少行可以啊,我把所有东西都缩起来,大括号循环判断都可以缩,有意义吗?只会白白牺牲代码可读性而已。更何况短的代码并不一定好,最简单的例子就是算质数的代码,你用简单的循环嵌套可以实现,代码行数少,可性能呢?
[/Quote]
BATTLERxANGE 2010-01-13
  • 打赏
  • 举报
回复
没玩过,所以不知道- =
r_yuan 2010-01-13
  • 打赏
  • 举报
回复
[Quote=引用 67 楼 heguodong 的回复:]
这个问题上帝已经解决把公式描述出来了,是格雷二进制编码的问题,大师的名字就叫高纳德.克努特
公式就是
T0=空
Tn+1="0"+Tn,"1"+Tn的逆
参考 < <计算机程序设计艺术 第四卷 第二册>>
比如T0=空
则T1={0,1}
  T2=0{0,1},1{1,0}=00,01,11,10
  T3=0{00,01,11,10},1{10,11,01,00}
    =000,001,011,010,110,111,101,100
  ...依次类推
  T9=...
这个组合里包含了所有的可能性,注意到按这个方法形成的组合无论往左还是往右,都只有一个位变化了
如果是3连环的话,将环套上的顺序是000,001,011,010,110,111
环取下的顺序正好相反
要判断在每个状态下具体一个环是否能套上,则判断该状态右边的值是否与该环对应的值不同
要判断在每个状态下具体一个环是否能取下,则判断该状态左边的值是否与该环对应的值不同
算法就是这样,程序自己写吧
[/Quote]
牛人不得不佩服
heguodong 2010-01-13
  • 打赏
  • 举报
回复
这个问题上帝已经解决把公式描述出来了,是格雷二进制编码的问题,大师的名字就叫高纳德.克努特
公式就是
T0=空
Tn+1="0"+Tn,"1"+Tn的逆
参考<<计算机程序设计艺术 第四卷 第二册>>
比如T0=空
则T1={0,1}
T2=0{0,1},1{1,0}=00,01,11,10
T3=0{00,01,11,10},1{10,11,01,00}
=000,001,011,010,110,111,101,100
...依次类推
T9=...
这个组合里包含了所有的可能性,注意到按这个方法形成的组合无论往左还是往右,都只有一个位变化了
如果是3连环的话,将环套上的顺序是000,001,011,010,110,111
环取下的顺序正好相反
要判断在每个状态下具体一个环是否能套上,则判断该状态右边的值是否与该环对应的值不同
要判断在每个状态下具体一个环是否能取下,则判断该状态左边的值是否与该环对应的值不同
算法就是这样,程序自己写吧
claymore1114 2010-01-12
  • 打赏
  • 举报
回复
帮顶 等高人
tianliang1 2010-01-12
  • 打赏
  • 举报
回复
是栈结构吧!
r_yuan 2010-01-12
  • 打赏
  • 举报
回复
自己顶下顺带沙发咯 对了给你们提示 两个函数是
Upall(n)
{

}

DownAll(n)
{

}
sxianjun 2010-01-12
  • 打赏
  • 举报
回复
沙发
波导终结者 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 59 楼 litaoye 的回复:]
虽然没玩过9连环,不过这100多行代码看起来有点......
按照微软的说法是可维护性指数63,圈复杂度54

引用 48 楼 alifriend 的回复:
结合实物完成了算法

[/Quote]
不好意思,我连测试数据、结果输出、UpOne、DownOne实现的代码全部贴上去了,而且这只是一时兴起写的,只保证结果而已。

话说回来,代码的行数并不能完全说明问题,你要少行可以啊,我把所有东西都缩起来,大括号循环判断都可以缩,有意义吗?只会白白牺牲代码可读性而已。更何况短的代码并不一定好,最简单的例子就是算质数的代码,你用简单的循环嵌套可以实现,代码行数少,可性能呢?

微软那玩意儿我在公司用08的时候试过,不可尽信。就比如说有个窗体用到了DevExpress的控件,里面有很多控件自动生成的东西,微软说可维护度20,可我压根就没有代码……
susan_wenjuan 2010-01-12
  • 打赏
  • 举报
回复
up
mmc_eric 2010-01-12
  • 打赏
  • 举报
回复
顶顶啊!
绿色夹克衫 2010-01-12
  • 打赏
  • 举报
回复
虽然没玩过9连环,不过这100多行代码看起来有点......
按照微软的说法是可维护性指数63,圈复杂度54

[Quote=引用 48 楼 alifriend 的回复:]
结合实物完成了算法
[/Quote]
chin_994 2010-01-12
  • 打赏
  • 举报
回复
数据结构学的本来就不多,说到用~~~~~~那就更不用说咯,嘻嘻
r_yuan 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 54 楼 alifriend 的回复:]
C# codebool[] Nine={true,true,true,true,true,true,true,true,true };privatevoid button1_Click(object sender, EventArgs e)
{
DownAll(6);for (int i=0; i<9; i++)
{
textBox1.Text+= Nine[i].ToString()+"\r\n";
}
textBox1.Text+="-----------\r\n";
UpAll(9);for (int i=0; i<9; i++)
{
textBox1.Text+= Nine[i].ToString()+"\r\n";
}
}privatevoid UpAll(int index)//把index及其以下的全部装上 {switch (index)
{case1:
UpOne(1);break;case2:
UpOne(1);
UpOne(2);break;case3:case4:case5:case6:case7:case8:case9:
UpAll(index-1);
DownAll(index-2);
UpOne(index);
UpAll(index-2);break;default:break;
}
}privatevoid DownAll(int index)//把index及其以下的全部卸下 {switch (index)
{case1:
DownOne(1);break;case2:
UpOne(1);
DownOne(2);
DownOne(1);break;case3:case4:case5:case6:case7:case8:case9:
UpAll(index-1);
DownAll(index-2);
DownOne(index);
DownAll(index-1);break;default:break;
}
}privatevoid UpOne(int index)//装上某一个,若不合规则则无动作 {if (Nine[index-1]) {return; }switch (index)
{case1:
Nine[index-1]=true;break;case2:if (Nine[0])
{ Nine[index-1]=true; }break;case3:case4:case5:case6:case7:case8:case9:if (!Nine[index-2]) {break; }for (int i=1; i<= index-2; i++)
{if (Nine[i-1]) {break; }
}
Nine[index-1]=true;break;default:break;
}
}privatevoid DownOne(int index)//卸下某一个,若不合规则则无动作 {if (!Nine[index-1]) {return; }switch (index)
{case1:
Nine[index-1]=false;break;case2:if (Nine[0])
{ Nine[index-1]=false; }break;case3:case4:case5:case6:case7:case8:case9:if (!Nine[index-2]) {break; }for (int i=1; i<= index-2; i++)
{if (Nine[i-1]) {break; }
}
Nine[index-1]=false;break;default:break;
}
}

修正一下,顺便帮你断楼
楼上那代码是PHP的

你说的控制台打给他看到底是啥意思?如果是把结果输出,那他得把UpOne和DownOne给实现了才行吧。
[/Quote]
对的 我当时就在迷糊怎么用控制台输出给他看呢CONSOLE.WRITE();实现给他看呢 那么照我的理解应该是要把Upone和DownOne具体实现才行
r_yuan 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 alifriend 的回复:]
C# codebool[] Nine={true,true,true,true,true,true,true,true,true };privatevoid button1_Click(object sender, EventArgs e)
{
DownAll(6);for (int i=0; i<9; i++)
{
textBox1.Text+= Nine[i].ToString()+"\r\n";
}
textBox1.Text+="-----------\r\n";
UpAll(9);for (int i=0; i<9; i++)
{
textBox1.Text+= Nine[i].ToString()+"\r\n";
}
}privatevoid UpAll(int index)//把index及其以下的全部装上 {switch (index)
{case1:
UpOne(1);break;case2:
UpOne(1);
UpOne(2);break;case3:case4:case5:case6:case7:case8:case9:for (int i= index-1; i>=1; i--)
{
UpAll(i);
}for (int i= index-2; i>=1; i--)
{
DownAll(i);
}
UpOne(index);for (int i= index-2; i>=1; i--)
{
UpAll(i);
}break;default:break;
}
}privatevoid DownAll(int index)//把index及其以下的全部卸下 {switch (index)
{case1:
DownOne(1);break;case2:
UpOne(1);
DownOne(2);break;case3:case4:case5:case6:case7:case8:case9:for (int i= index-1; i>=1; i--)
{
UpAll(i);
}for (int i= index-2; i>=1; i--)
{
DownAll(i);
}
DownOne(index);for (int i= index-1; i>=1; i--)
{
DownAll(i);
}break;default:break;
}
}privatevoid UpOne(int index)//装上某一个,若不合规则则无动作 {if (Nine[index-1]) {return; }switch (index)
{case1:
Nine[index-1]=true;break;case2:if (Nine[0])
{ Nine[index-1]=true;}break;case3:case4:case5:case6:case7:case8:case9:if (!Nine[index-2]) {break; }for (int i=1; i<= index-2; i++)
{if (Nine[i-1]) {break; }
}
Nine[index-1]=true;break;default:break;
}
}privatevoid DownOne(int index)//卸下某一个,若不合规则则无动作 {if (!Nine[index-1]) {return; }switch (index)
{case1:
Nine[index-1]=false;break;case2:if (Nine[0])
{ Nine[index-1]=false; }break;case3:case4:case5:case6:case7:case8:case9:if (!Nine[index-2]) {break; }for (int i=1; i<= index-2; i++)
{if (Nine[i-1]) {break; }
}
Nine[index-1]=false;break;default:break;
}
}

结合实物完成了算法
[/Quote]
大哥我不得不佩服你真聪明,小弟在那坐了一个小时都没写出具体东西来 !真的很不错啊 就是有些地方还没看明白
xiangxiao_bobo 2010-01-12
  • 打赏
  • 举报
回复
面试的题都很恶心呀!这个题也不例外!没玩过,都不明白是什么意思
波导终结者 2010-01-12
  • 打赏
  • 举报
回复
        bool[] Nine ={ true, true, true, true, true, true, true, true, true };
private void button1_Click(object sender, EventArgs e)
{
DownAll(6);
for (int i = 0; i < 9; i++)
{
textBox1.Text += Nine[i].ToString() + "\r\n";
}
textBox1.Text += "-----------\r\n";
UpAll(9);
for (int i = 0; i < 9; i++)
{
textBox1.Text += Nine[i].ToString() + "\r\n";
}
}
private void UpAll(int index)//把index及其以下的全部装上
{
switch (index)
{
case 1:
UpOne(1);
break;
case 2:
UpOne(1);
UpOne(2);
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
UpAll(index - 1);
DownAll(index - 2);
UpOne(index);
UpAll(index - 2);
break;
default:
break;
}
}

private void DownAll(int index)//把index及其以下的全部卸下
{
switch (index)
{
case 1:
DownOne(1);
break;
case 2:
UpOne(1);
DownOne(2);
DownOne(1);
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
UpAll(index - 1);
DownAll(index - 2);
DownOne(index);
DownAll(index - 1);
break;
default:
break;
}
}
private void UpOne(int index)//装上某一个,若不合规则则无动作
{
if (Nine[index - 1]) { return; }
switch (index)
{
case 1:
Nine[index - 1] = true;
break;
case 2:
if (Nine[0])
{ Nine[index - 1] = true; }
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
if (!Nine[index - 2]) { break; }
for (int i = 1; i <= index - 2; i++)
{
if (Nine[i - 1]) { break; }
}
Nine[index - 1] = true;
break;
default:
break;
}
}
private void DownOne(int index)//卸下某一个,若不合规则则无动作
{
if (!Nine[index - 1]) { return; }
switch (index)
{
case 1:
Nine[index - 1] = false;
break;
case 2:
if (Nine[0])
{ Nine[index - 1] = false; }
break;
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
if (!Nine[index - 2]) { break; }
for (int i = 1; i <= index - 2; i++)
{
if (Nine[i - 1]) { break; }
}
Nine[index - 1] = false;
break;
default:
break;
}
}


修正一下,顺便帮你断楼
楼上那代码是PHP的

你说的控制台打给他看到底是啥意思?如果是把结果输出,那他得把UpOne和DownOne给实现了才行吧。
r_yuan 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 linux7985 的回复:]
PHP codeNine circle<br><?$play=array(1,1,1,1,1,1,1,1,1);function setit($i,$s)
{global$play;static$stat=array('down','up');if($play[$i]==$s)return;if($i<=7)
{//set $i+1 up $i+2 ... down setit($i+1,1);for($j=$i+2;$j<=8;$j++)
{
setit($j,0);
}
}$play[$i]=$s;echo ($i+1)."$stat[$s]\n";return;
}echo"From all up to all down\n";for($i=0;$i<=8;$i++)
{
setit($i,0);
}$play=array(0,0,0,0,0,0,0,0,0);echo"From all down to all up\n";for($i=0;$i<=8;$i++)
{
setit($i,1);
}?>

自己改改
[/Quote]
达人 你的方法我没看懂 请解释下你写的代码谢谢
加载更多回复(49)

111,120

社区成员

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

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

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