网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
05月12日漏签0天
c语言吧 关注:798,978贴子:4,355,322
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 10回复贴,共1页
<<返回c语言吧
>0< 加载中...

花了半个多钟头编了一个汉诺塔,16个盘子就运行了22秒啊,伤不起

  • 只看楼主
  • 收藏

  • 回复
  • 945269529
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include<stdio.h>
static int a,b,c,i;
void cal(char x,char z)
{
if(x=='A')
a--;
else if(x=='B')
b--;
else
c--; if(z=='A')
a++;
else if(z=='B')
b++;
else
c++;
}
void hanoi(int n,char x,char y,char z)
{
if(n==1)
{
cal(x,z);
i++;
printf("%d.Move plate %d from %c to %c -- A:%d B:%d C:%d\n",i,n,x,z,a,b,c);
}
else
{
hanoi(n-1,x,z,y);
cal(x,z);
i++;
printf("%d.Move plate %d from %c to %c -- A:%d B:%d C:%d\n",i,n,x,z,a,b,c);
hanoi(n-1,y,x,z);
}
}
void main()
{
int n;
printf("Number of plate:");
scanf("%d",&n);
a=n;
b=c=0;
i=0;
hanoi(n,'A','B','C');
}


  • 阿宾和白洁
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
递归当然慢咯!


2025-05-12 08:19:25
广告
  • 初学C入门
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
64个盘子你试试,看看出结果能不能等到宇宙灭掉的那天:)


  • 945269529
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
呵呵,2^16-1次都22秒了,2^64-1几乎是2^48被啊。


  • 945269529
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
再多几个还可以,每加一个盘子时间翻一番嘛。


  • 不死鸟鑫鑫
  • 低能力者
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
很正常了,递归调用使指数次幂的时间复杂度


  • 945269529
  • 异能力者
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
最主要还是这个问题太复杂了,2^16-1确实很大。


  • zbjinyiwei
  • 强能力者
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
没多一个盘子翻一倍,楼主怎么计算出来的?我是小白


2025-05-12 08:13:25
广告
  • yellowman01
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
16个盘子11.78秒,是CPU速度差异么,我的垃圾电脑啊...


  • yellowman01
  • 团子家族
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include<stdio.h>
#include<math.h>
//全局变量
double step=0;
//函数声明
void Move(int n,char x,char y);
void Hanoi(int n,char one,char two,char three);
//函数定义
void Move(int n,char x,char y)//移动盘子函数
{
step++;
printf("第%.0f步:移动第%d个盘子%c-->%c\n",step,n,x,y);
}//Move
void Hanoi(int n,char one,char two,char three)//汉诺塔递归
{
if(n==1)
Move(n,one,three);
else
{
Hanoi(n-1,one,three,two);
Move(n,one,three);
Hanoi(n-1,two,one,three);
}//else
}//Hanoi
//main函数
int main(void)
{
int n;
printf("请输入盘子的数量:\n");
scanf("%d",&n);
printf("移动盘子的步骤如下:\n\n");
Hanoi(n,'A','B','C');
printf("\n移动%d个盘子,总共需要%.0f个步骤\n",n,pow(2,n)-1);
return 0;
}//main


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 10回复贴,共1页
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示