专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

C语言解决汉诺塔问题!详细思路源码分享

  每天一个C语言小项目,提升你的编程能力!
  汉诺塔问题源自印度一个古老的传说
  印度教的创造之神梵天创造世界时做了3根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着64个黄金圆盘。梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上,移动过程中必须遵守以下规则:
  (1)每次只能移动柱子最顶端的一个圆盘;
  (2)每个柱子上,小圆盘永远要位于大圆盘之上。
  在汉诺塔问题中,当圆盘个数不大于3时,多数人都可以轻松想到移动方案,随着圆盘数量的增多,汉诺塔问题会越来越难。也就是说,圆盘的个数直接决定了汉诺塔问题的难度,解决这样的问题可以尝试用分治算法,将移动多个圆盘的问题分解成多个移动少量圆盘的小问题,这些小问题很容易解决,从而可以找到整个问题的解决方案。
  编译环境:VisualStudio20192022,EasyX插件
  这是经典问题汉诺塔的解题演示动画,代码如下:includegraphics。hincludeconio。hincludestdio。hdefineMAX64圆盘的最大数目defineNULL0定义栈structSTKNODE{inta〔4〕;};structSTK{STKNODEstack〔MAX〕;inttop;};定义全局变量STKs〔3〕;声明三个栈,分别代表一号二号三号钢针上圆盘的状态intv5;调整速度函数声明voidInitstk(STKs);初始化栈voidHannoi(intn,chara,charb,charc);汉诺塔递归voidstart();开始画面voidMove(intn,chara,charb);移动过程intswitchab(chara);返回钢针号voidadjust();调整速度暂停主函数voidmain(){intn,ta〔4〕{115,500,285,518};第一个圆盘的位置printf(尽量小于16);因为大于十六时就会显示有误,但程序可以正常运行printf(请输入汉诺塔的层数(164):);scanf(d,n);STKNODEp;p(STKNODE)malloc(nsizeof(STKNODE));声明一个元素为n个的动态STKNODE型指针数组for(inti20;i2n;i2){p〔i2〕(STKNODE)malloc(sizeof(STKNODE));为每一个指针申请空间}Initstk(s〔0〕);Initstk(s〔1〕);Initstk(s〔2〕);将三个栈初始化start();呈现开始画面setfillcolor(GREEN);圆盘的颜色for(inti0;in;i){ta〔0〕5;ta〔1〕20;ta〔2〕5;ta〔3〕20;solidrectangle(ta〔0〕,ta〔1〕,ta〔2〕,ta〔3〕);画出n个从大到小一次叠放的黄色圆盘s〔0〕。top;进栈for(inti10;i14;i1){p〔i〕a〔i1〕ta〔i1〕;s〔0〕。stack〔s〔0〕。top〕p〔i〕;记录每个矩形的位置,top为圆盘的个数}}Hannoi(n,a,b,c);汉诺塔递归函数system(pause);printf(GameOver!);}函数定义汉诺塔的递归voidHannoi(intn,chara,charb,charc){if(n1)Move(1,a,c);else{Hannoi(n1,a,c,b);Move(n,a,c);Hannoi(n1,b,a,c);}}栈的初始化voidInitstk(STKs){inti;stop0;for(i0;iMAX;i)sstack〔stop〕NULL;stop0;}移动过程voidMove(intn,chara,charb){inti3,i40,i50;i3ba;目的钢针与源钢针的位置差值i4switchab(a);源钢针钢针号i5switchab(b);目的钢针号STKNODEq1,q0;两个中间结点用于源栈和目的栈间的值得传递,q1为目的栈,q0为源栈q1(STKNODE)malloc(sizeof(STKNODE));q0(STKNODE)malloc(sizeof(STKNODE));源栈与目的栈值的传递q0s〔i4〕。stack〔s〔i4〕。top〕;s〔i5〕。top;进栈q1a〔0〕q0a〔0〕i3200;q1a〔1〕500s〔i5〕。top20;q1a〔2〕q0a〔2〕i3200;q1a〔3〕500s〔i5〕。top2018;s〔i5〕。stack〔s〔i5〕。top〕q1;s〔i4〕。top;出栈向上运动while(q0a〔1〕100){setfillcolor(GREEN);solidrectangle(q0a〔0〕,q0a〔1〕,q0a〔2〕,q0a〔3〕);adjust();调整函数Sleep(10v);暂停(ms)setfillcolor(WHITE);solidrectangle(q0a〔0〕,q0a〔1〕,q0a〔2〕,q0a〔3〕);setlinecolor(RED);line((q0a〔0〕q0a〔2〕)2,q0a〔1〕,(q0a〔0〕q0a〔2〕)2,q0a〔3〕);重新画上被擦掉原有的红线q0a〔1〕10;q0a〔3〕10;}向左或右运动,与i3的正负有关while(q0a〔2〕!q1a〔2〕){setfillcolor(GREEN);solidrectangle(q0a〔0〕,q0a〔1〕,q0a〔2〕,q0a〔3〕);adjust();Sleep(10v);setfillcolor(WHITE);solidrectangle(q0a〔0〕,q0a〔1〕,q0a〔2〕,q0a〔3〕);if(i30)i30向左移{q0a〔0〕20;q0a〔2〕20;}elsei30向右移{q0a〔0〕20;q0a〔2〕20;}}向下运动while(q0a〔3〕q1a〔3〕){setfillcolor(GREEN);solidrectangle(q0a〔0〕,q0a〔1〕,q0a〔2〕,q0a〔3〕);adjust();Sleep(10v);setfillcolor(WHITE);solidrectangle(q0a〔0〕,q0a〔1〕,q0a〔2〕,q0a〔3〕);setlinecolor(RED);if(q0a〔1〕100)重画被擦掉的红线{line((q0a〔0〕q0a〔2〕)2,q0a〔1〕,(q0a〔0〕q0a〔2〕)2,q0a〔3〕);}q0a〔1〕10;q0a〔3〕10;}在目的钢针上的相应位置绘制出黄色矩形块setfillcolor(GREEN);solidrectangle(q1a〔0〕,q1a〔1〕,q1a〔2〕,q1a〔3〕);}绘制开始界面voidstart(){初始化画面大小initgraph(800,650);背景设为白色setbkcolor(WHITE);用白色填充整个画面cleardevice();绘制彩虹,形成一道彩虹,摘自easyx帮助文档示例程序floatH,S,L;H0;色相S1;饱和度L0。5f;亮度setlinestyle(PSSOLID,2);设置线宽为2for(intr600;r544;r){H5;setlinecolor(HSLtoRGB(H,S,L));circle(750,900,r);}说明settextstyle(50,0,华文楷体);settextcolor(RED);outtextxy(200,150,汉诺塔移动动画);settextstyle(20,0,黑体);outtextxy(600,200,BY:Ronald);outtextxy(500,200,版本V1。1);settextstyle(50,0,黑体);settextcolor(GREEN);outtextxy(200,350,随便按一个键开始吧!);检测键盘敲击getch();清空开始界面cleardevice();绘制运动画面的的环境setlinecolor(RED);三根红色线段作为钢针line(400,110,400,500);line(600,110,600,500);line(200,110,200,500);长方体形的底座setfillcolor(LIGHTGRAY);fillrectangle(80,501,720,510);暂停按钮solidrectangle(360,540,440,580);settextstyle(30,0,黑体);settextcolor(GREEN);outtextxy(370,550,暂停);settextstyle(20,0,宋体);settextcolor(RED);outtextxy(300,580,鼠标暂停后请按空格继续);加速按钮solidrectangle(160,540,240,580);settextstyle(30,0,黑体);settextcolor(GREEN);outtextxy(170,550,加速);settextstyle(20,0,宋体);settextcolor(RED);outtextxy(170,580,请按d);减速按钮solidrectangle(560,540,640,580);settextstyle(30,0,黑体);settextcolor(GREEN);outtextxy(570,550,减速);settextstyle(20,0,宋体);settextcolor(RED);outtextxy(570,580,请按a);说明settextstyle(50,0,宋体);settextcolor(GREEN);outtextxy(10,10,正在进行中请欣赏:);}判断目的钢针与源钢针的钢针号返回钢针号intswitchab(chara){switch(a){casea:return0;caseb:return1;casec:return2;default:return0;}}调整函数,实现加速,减速,暂停voidadjust(){charf;接收键盘敲进去的按钮和鼠标点击时赋予的变化值用f接受键盘的键入值if(kbhit())fgetch();检测鼠标消息if(MouseHit()true){接收鼠标消息MOUSEMSGMouse;MouseGetMouseMsg();响应鼠标消息if(Mouse。x360Mouse。x440Mouse。y540Mouse。y580Mouse。mkLButton){f;}if(Mouse。x160Mouse。x240Mouse。y540Mouse。y580Mouse。mkLButton){fd;}if(Mouse。x560Mouse。x640Mouse。y540Mouse。y580Mouse。mkLButton){fa;}}作用于动画switch(f){暂停case:用‘继续’覆盖‘暂停’settextstyle(30,0,黑体);settextcolor(GREEN);outtextxy(370,550,继续);getch();继续后变回显示‘暂停’settextstyle(30,0,黑体);settextcolor(GREEN);outtextxy(370,550,暂停);break;减速casea:当被点击时,‘减速’位置震动一下setfillcolor(LIGHTGRAY);solidrectangle(560,540,640,580);settextstyle(30,0,黑体);settextcolor(GREEN);outtextxy(575,545,减速);Sleep(30);减速v;回原位setfillcolor(LIGHTGRAY);solidrectangle(560,540,640,580);settextstyle(30,0,黑体);settextcolor(GREEN);outtextxy(570,550,减速);break;加速cased:setfillcolor(LIGHTGRAY);solidrectangle(160,540,240,580);settextstyle(30,0,黑体);settextcolor(GREEN);outtextxy(165,545,加速);Sleep(30);setfillcolor(LIGHTGRAY);solidrectangle(160,540,240,580);settextstyle(30,0,黑体);settextcolor(GREEN);outtextxy(170,550,加速);加速v;v最小为1if(v0){v1;}break;default:break;}fr;f初始化为rFlushMouseMsgBuffer();清空鼠标消息}
  大家赶紧去动手试试吧!
  此外,我也给大家分享我收集的其他资源,从最零基础开始的教程到C语言C项目案例,帮助大家在学习C语言的道路上披荆斩棘!
  编程学习书籍分享:
  编程学习视频分享:
  整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)最重要的是你可以在群里面交流提问编程问题哦!
  对于CC感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些CC的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

磐耀资产看好物联网领域布局机会中证网讯(记者朱涵)近日,磐耀资产称,随着苹果MR的发布以及AI产业的迅速发展,看好物联网领域的投资布局机会。就半导体IC设计方向来看,磐耀资产表示,科技自立自强和库存修复仍然是当期权入市手册(六)期权的主要用途编者按2022年9月19日,深市期权新品种创业板ETF期权(标的为创业板ETF,代码159915)中证500ETF期权(标的为中证500ETF,代码159922)上市交易。为帮助投济南二机床突破关键核心技术,发力高端工业母机3月20日下午,山东省组织的走文化廊道进经济园区看山东高质量发展行进式主题采访活动走胶济铁路文化体验线来到济南二机床集团有限公司(以下简称济南二机床)。作为世界三大数控冲压装备制造比亚迪蔚来你知道的国内汽车厂,用的都是济南二机床冲压设备3月20日下午,山东省组织的走文化廊道进经济园区看山东高质量发展行进式主题采访活动走胶济铁路文化体验线来到济南二机床集团有限公司(以下简称济南二机床)。作为世界三大数控冲压装备制造A股短期下杀,只是情绪宣泄明天收复5日均线,大盘还有一涨!在周末降准的利好影响下,今天上午市场出现一波短暂的快速反弹。但午后市场很快就进入调整,电信龙头跳水,证券板块跳水,白酒板块大跌,成交量放大,这是对突发消息的反应。但一般情况下急跌都金价创11个月以来新高,今年央行已买入40吨,我应该下手吗?硅谷银行破产瑞信暴雷等引发全球金融风险加剧,叠加美联储加息预期放缓,国际金价逼近2000美元盎司关口。截至3月17日收盘,现货黄金突破1988美元盎司,创近11个月以来新高。值得注股市降准没有用降印花税才是真正利好3月财经新势力上个星期五股市收盘出来一个降准的消息,很多股民痴痴想这应该是一个利好消息!冷静人士说最多股市就高开低走,因为目前股市并没有上涨的基础。一二月份印花税大降,说明买卖股票以色列商务考察创新之路的奥秘以色列作为发展国家,赢得了很多国家的关注,尤其是创新之路,更是让人羡慕,选择黄金商学,我们和您一起商务考察,全面了解以色列的创新之路。一创新成功的深厚历史文化底蕴以色列的创新成功之拥抱数据共赢未来第四届联合国世界数据论坛聚焦四大主题人民网北京3月20日电(记者杨曦)据国家统计局消息,第四届联合国世界数据论坛将于2023年4月2427日在中国杭州举办。本届论坛主口号为拥抱数据共赢未来,体现了当今人类社会与数据的散文细奶奶的豆豉茶文王成家在天寒地冻的日子,惟有美食最能抚慰人心,只因那些温暖的食物,从冷冰冰的食材到美味可口的食物的过程中,注入的都是亲人满满的浓浓的爱。我的家乡湖南桂阳北半县,农人劳作之余喜欢喝1991年,用2。8亿生活用品换来苏联飞机的四川富豪,后来怎样我要炸开喜马拉雅山,引来印度洋的暖湿气流,把这高寒之地变成江南水乡。1991年,一位四川富豪用2。8亿个生活用品换来苏联飞机的新闻在中国引起了轰动。那时正值中国改革开放的高潮期,人
巴黎时装周的女明星们,谁赢了?今年的巴黎时装周可谓是精彩纷呈,重新踏上巴黎时装周的国内女明星们,施展浑身解数,力求在众星云集,时尚弄潮儿聚集的时装周上,留下属于自己的足迹。至于谁的造型最让大家印象深刻,就是仁者徐若晗登男人装,吊带抹胸又纯又欲,不愧是言承旭心动的人在最近热播的网剧夏花中,徐若晗与言承旭的忘年恋甜到齁。两人虽然年龄差距悬殊,但精彩不断,上演各种吻戏天花板,徐若晗也因此成为许多男生的梦中情人。近日,25岁的徐若晗登上男人装,突破拥有性感与美腿的孙怡礼服在时尚圈中一直是备受瞩目的单品,它不仅能让众多明星在走秀时走出风采展示出曼妙身姿,也能无形中影响大众人的穿搭风格,很多明星对此都格外重视。说起孙怡,很多人都很难想象她会挑战性感朱丽安霍夫刚刚推出了90年代风格的钝头鲍勃朱丽安霍夫准备好换发型了即使是很细微的变化她依靠自己的造型师和老朋友,里亚瓦纳卡普里。在新的十年即将到来之际,换个发型是一个很好的理由,霍夫似乎也同意这一点。这位舞蹈家和演员给她的星空头条创作挑战赛星空是人类最深情的憧憬,它承载着人们对未知世界的好奇和向往。当夜幕降临,星星点点,如同千千万万颗闪亮的眼睛,照亮了整个世界。我喜欢在清晨或夜晚出门,仰望星空。在这个世一份爱,只为你而存在你的出现,如同一道温柔的风,吹走了我的孤独,填补了我的空虚。从那一刻起,我就深深地爱上了你,将我的一切都交付给了你。每一次与你的相遇,我都感到无比幸福,每一次与你的分别,我都感到无人生八句话,越看越心宽!第一句来时,干干净净,去时,两手空空。既然生死之时,都没有附属物。又何必把钱财物质看重?轻松生活,快乐度日,才是此生最好的收获。第二句大千世间,遇人无数,爱你的人,给你温暖伤你的人怒放的生命白日不到处,青春恰自来,苔花如米小,也学牡丹开。这是袁枚的一首古诗。我虽已烂背于心,但始终无法真正领悟其中的含义。今天在小区花园散步,我无意间在草地的石缝间看见了一朵不起眼的小花。无论谁看到这篇文,都希望你能对自己好点,能尽力幸福生活在这样一个物欲横流的世界,若一开始家境富足,父母有爱,亲友和睦,友人真诚,自是内心富足,即便遇上人生的悲欢离合,也能开阔些,释然些。可事事圆满,如意,顺心的,又能有几人呢?大多外媒镜头下的国内女星,真实堪比照妖镜,周迅杨幂现原形文奇物君编辑奇物君前言女明星在国内走红毯,拍出的照片个个颜值逆天,肤白貌美大长腿,然而在外媒镜头下,又是另一番模样。被称为照妖镜的外媒,无美颜无滤镜无P图,堪称强力卸妆水,拍照不可消防员紧急救援女子穿裙子意外陷入泥坑无法自拔!今日,一段消防员徒手拔腿救人的视频在网络上广泛传播,视频中一名女孩穿着裙子陷入泥坑,消防员通过双人合作施救将其成功救出。这个事件引起了很多人的关注和讨论,除了救援的过程,人们还关注
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网