| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 769 人关注过本帖
标题:请教高手——————汉诺塔。
只看楼主 加入收藏
五当家
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:2
帖 子:1112
专家分:3674
注 册:2010-10-20
结帖率:96.3%
收藏
已结贴  问题点数:20 回复次数:8 
请教高手——————汉诺塔。
#include<stdio.h>
void main()
{
    void hanoi(int n,char one,char two,char three);
    int m;
    printf("input the number of diskes:");
    scanf("%d",&m);
    printf("The step to moveing %d diskes:\n",m);
    hanoi(m,'A','B','C');
}
void hanoi(int n,char one,char two,char three)         //谁能跟我说说从这里开始是怎么样运行的呢?
{
    void move(char x,char y);
    if(n==1)
        move(one,three);
    else
    {
        hanoi(n-1,one,three,two);
        move(one,three);
        hanoi(n-1,two,one,three);
    }
}
void move(char x,char y)
{
    printf("%c-->%c\n",x,y);;
}
搜索更多相关主题的帖子: 汉诺塔 
2010-10-31 23:28
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
收藏
得分:4 
你数据结构数应该有个图解说明吧 还有步骤的的先后

清风拂暮(木)
2010-11-01 00:38
清风拂晓
Rank: 8Rank: 8
来 自:火星
等 级:蝙蝠侠
威 望:1
帖 子:356
专家分:889
注 册:2010-8-13
收藏
得分:0 
这里不好说 只能说这里的递归有点想栈从外层到内层求解 ,要解得外层的就要先从最里层的开始然后逐层向外

清风拂暮(木)
2010-11-01 00:41
delong
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:57
专家分:126
注 册:2010-6-9
收藏
得分:4 
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
void move(char a,char b,int c);
void outputt(char a,char b,int c);
int x[9],y[9],z[9],count=0;
int main()
{
int i;
char s[99];
int n;
system("color 0A");
do
{
system("cls");
printf("此为汉诺塔演示程序\n请输入汉诺塔阶数(1-9):\n");
scanf("%s",s);
}while(strlen(s)!=1||s[0]<49||s[0]>57);
n=s[0]-48;
for(i=0;i<=n-1;i++)
x[n-1-i]=2*i+1;
for(i=n;i<9;i++)
x[i]=0;
for(i=0;i<9;i++)
y[i]=0;
for(i=0;i<9;i++)
z[i]=0;
outputt('a','b',1);
getchar();
move('x','z',n);
return 0;
}
void move(char a,char b,int c)
{
int i,xtop,ytop,ztop;
if(c==1)
{
for(i=0;i<9;i++)
if(x[i]==0) break;
xtop=i-1;
for(i=0;i<9;i++)
if(y[i]==0) break;
ytop=i-1;
for(i=0;i<9;i++)
if(z[i]==0) break;
ztop=i-1;
if(a=='x'&&b=='y')
{
y[ytop+1]=x[xtop];
x[xtop]=0;
}
else if(a=='x'&&b=='z')
{
z[ztop+1]=x[xtop];
x[xtop]=0;
}
else if(a=='y'&&b=='x')
{
x[xtop+1]=y[ytop];
y[ytop]=0;
}
else if(a=='y'&&b=='z')
{
z[ztop+1]=y[ytop];
y[ytop]=0;
}
else if(a=='z'&&b=='x')
{
x[xtop+1]=z[ztop];
z[ztop]=0;
}
else
{
y[ytop+1]=z[ztop];
z[ztop]=0;
}
count++;
outputt('a','b',1);
}
else
{
if(a!='x'&&b!='x')
{
move(a,'x',c-1);
move(a,b,1);
move('x',b,c-1);
}
else if(a!='y'&&b!='y')
{
move(a,'y',c-1);
move(a,b,1);
move('y',b,c-1);
}
else
{
move(a,'z',c-1);
move(a,b,1);
move('z',b,c-1);
}
}
}
void outputt(char a,char b,int c)
{
int i,j;
int p1[9],p2[9],p3[9],p4[9],p5[9],p6[9],p7[9];
for(i=0;i<9;i++)
p1[i]=x[i]-(!x[i]);
for(i=0;i<9;i++)
p1[i]=8-(p1[i]-1)/2;
for(i=0;i<9;i++)
p2[i]=x[i];
for(i=0;i<9;i++)
p3[i]=y[i]-(!y[i]);
for(i=0;i<9;i++)
p3[i]=25-(p3[i]-1)/2-p1[i]-p2[i];
for(i=0;i<9;i++)
p4[i]=y[i];
for(i=0;i<9;i++)
p5[i]=z[i]-(!z[i]);
for(i=0;i<9;i++)
p5[i]=42-(p5[i]-1)/2-p1[i]-p2[i]-p3[i]-p4[i];
for(i=0;i<9;i++)
p6[i]=z[i];
for(i=0;i<9;i++)
p7[i]=51-p1[i]-p2[i]-p3[i]-p4[i]-p5[i]-p6[i];
system("cls");
printf("===================此为汉诺塔演示程序===================\n");
printf("=========================第%d步",count);
if(count<10) printf("==========================\n");
else if(count>=10&&count<100) printf("=========================\n");
else printf("========================\n");
printf("\n\n\n\n\n");
for(i=8;i>=0;i--)
{
for(j=1;j<=5;j++) printf(" ");
for(j=1;j<=p1[i];j++) printf(" ");
for(j=1;j<=p2[i];j++) printf("%c",22);
for(j=1;j<=p3[i];j++) printf(" ");
for(j=1;j<=p4[i];j++) printf("%c",22);
for(j=1;j<=p5[i];j++) printf(" ");
for(j=1;j<=p6[i];j++) printf("%c",22);
for(j=1;j<=p7[i];j++) printf(" ");
printf("\n");
}
//        printf("\n\n按回车键继续...");
//        getchar();
for(i=0;i<3e8;i++);
}

网上借来的~一起分享~
2010-11-01 08:45
夜来香
Rank: 1
等 级:新手上路
帖 子:1
专家分:5
注 册:2010-11-1
收藏
得分:4 
#include<stdio.h>
void main()
{
    void hanoi(int n,char one,char two,char three);           //函数声明
    int m;
    printf("input the number of diskes:");
    scanf("%d",&m);
    printf("The step to moveing %d diskes:\n",m);
    hanoi(m,'A','B','C');              //调用hanoi函数
}
void hanoi(int n,char one,char two,char three)        
{
    void move(char x,char y);   //函数声明
    if(n==1)
        move(one,three);  //调用move函数
    else
    {
        hanoi(n-1,one,three,two);
        move(one,three);
        hanoi(n-1,two,one,three);
    }
}
void move(char x,char y)
{
    printf("%c-->%c\n",x,y);;
}
2010-11-01 09:22
五当家
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:2
帖 子:1112
专家分:3674
注 册:2010-10-20
收藏
得分:0 
说的我不明白,我还是去问老师吧!

经验积累中............
2010-11-01 12:05
五当家
Rank: 12Rank: 12Rank: 12
等 级:火箭侠
威 望:2
帖 子:1112
专家分:3674
注 册:2010-10-20
收藏
得分:0 
总之还是谢谢啦!

经验积累中............
2010-11-01 12:06
金山游侠
Rank: 2
等 级:论坛游民
帖 子:11
专家分:11
注 册:2010-10-29
收藏
得分:0 
递归思想
2010-11-03 16:04
指冷玉笙寒
Rank: 2
等 级:论坛游民
帖 子:5
专家分:11
注 册:2010-4-14
收藏
得分:0 
主要是楼主没理解递归,以及C函数的调用栈。
2010-11-03 19:19
快速回复:请教高手——————汉诺塔。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022052 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved