空军能不能谈一下汉诺塔中的柱子的数据结构设计

plglenn28 2009-12-23 08:37:45
...全文
93 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
十八道胡同 2009-12-23
  • 打赏
  • 举报
回复
可以推荐楼主写个最简单的字符串逆序,用到了栈,stack.
十八道胡同 2009-12-23
  • 打赏
  • 举报
回复
hanoi问题,主要是思路 ,就是想法,有想法代码就很简单,因为没有用到复杂的数据结构
silentwins 2009-12-23
  • 打赏
  • 举报
回复
算次数的时候,柱子除了分a、b、c之外,期间abc无需储存任何数据
wiki14 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 plglenn28 的回复:]
柱子的数据结构设计
[/Quote]

主要是算法的问题。

贴个C#的~

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HanoiProgram
{
class Program
{
static long count = 0;
static void move(char x,char y)
{
Console.WriteLine("{0}--->{1}",x,y);
}
static void hanoi(int n,char one,char two,char three)
{
if (n == 1)
{
count+=2;
move(one, two);
move(two, three);
}
else
{
count += 2;
hanoi(n - 1, one,two,three);
move(one, two);
hanoi(n - 1, three,two,one);
move(two,three);
hanoi(n - 1, one, two, three);
}
}
static void Main(string[] args)
{
Console.WriteLine("需要搬几个盘子");
int n =int.Parse(Console.ReadLine());
hanoi(n, 'A', 'B', 'C');
Console.WriteLine("搬迁结速;一共进行了{0}次的搬迁。", count);
Console.Read();
}

}
}
十八道胡同 2009-12-23
  • 打赏
  • 举报
回复
用到数据结构的地方 是用来存贮数据的,就像是2叉树,hashtable一样,这些是数据结构
十八道胡同 2009-12-23
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 plglenn28 的回复:]
柱子的数据结构设计
[/Quote]
这个没有数据结构,自己想象的,这个并不需要存贮什么
plglenn28 2009-12-23
  • 打赏
  • 举报
回复
柱子的数据结构设计
wiki14 2009-12-23
  • 打赏
  • 举报
回复
其实,说白了就是用了个递归!
silentwins 2009-12-23
  • 打赏
  • 举报
回复
木人回答,抄来慢慢看

*问题分析与算法设计
这是一个著名的问题,几乎所有的教材上都有这个问题。由于条件是一次只能移动一个盘,且不允许大盘放在小盘上面,所以64个盘的移动次数是:
18,446,744,073,709,551,615
这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决较小N值时的汉诺塔,但很难用计算机解决64层的汉诺塔。
分析问题,找出移动盘子的正确算法。
首先考虑a杆下面的盘子而非杆上最上面的盘子,于是任务变成了:
*将上面的63个盘子移到b杆上;
*将a杆上剩下的盘子移到c杆上;
*将b杆上的全部盘子移到c杆上。
将这个过程继续下去,就是要先完成移动63个盘子、62个盘子、61个盘子....的工作。
为了更清楚地描述算法,可以定义一个函数movedisc(n,a,b,c)。该函数的功能是:将N个盘子从A杆上借助C杆移动到B杆上。这样移动N个盘子的工作就可以按照以下过程进行:
1) movedisc(n-1,a,c,b);
2) 将一个盘子从a移动到b上;
3) movedisc(n-1,c,b,a);
重复以上过程,直到将全部的盘子移动到位时为止。
*程序与程序注释
#include<stdio.h>
void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle);
int i=0;
void main()
{
unsigned n;
printf("please enter the number of disc:");
scanf("%d",&n); /*输入N值*/
printf("\tneedle:\ta\t b\t c\n");
movedisc(n,'a','c','b'); /*从A上借助B将N个盘子移动到C上*/
printf("\t Total: %d\n",i);
}
void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle)
{
if(n>0)
{
movedisc(n-1,fromneedle,usingneedle,toneedle);
/*从fromneedle上借助toneedle将N-1个盘子移动到usingneedle上*/
++i;
switch(fromneedle) /*将fromneedle 上的一个盘子移到toneedle上*/
{
case 'a': switch(toneedle)
{
case 'b': printf("\t[%d]:\t%2d.........>%2d\n",i,n,n);
break;
case 'c': printf("\t[%d]:\t%2d...............>%2d\n",i,n,n);
break;
}
break;
case 'b': switch(toneedle)
{
case 'a': printf("\t[%d]:\t%2d<...............>%2d\n",i,n,n);
break;
case 'c': printf("\t[%d]:\t %2d........>%2d\n",i,n,n);
break;
}
break;
case 'c': switch(toneedle)
{
case 'a': printf("\t[%d]:\t%2d<............%2d\n",i,n,n);
break;
case 'b': printf("\t[%d]:\t%2d<........%2d\n",i,n,n);
break;
}
break;
}
movedisc(n-1,usingneedle,toneedle,fromneedle);
/*从usingneedle上借助fromneedle将N-1个盘子移动到toneedle上*/
}
}
wuyq11 2009-12-23
  • 打赏
  • 举报
回复
注意算法流程
每一次递归算法中将n-1 个盘子移动的目标是不同的

62,253

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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