收藏 分销(赏)

汉诺塔的C++.doc

上传人:pc****0 文档编号:6644645 上传时间:2024-12-19 格式:DOC 页数:8 大小:31.50KB 下载积分:10 金币
下载 相关 举报
汉诺塔的C++.doc_第1页
第1页 / 共8页
汉诺塔的C++.doc_第2页
第2页 / 共8页


点击查看更多>>
资源描述
汉诺塔的C/C++程序 2009-11-05 09:58:08| 分类: 默认分类 | 标签:无|字号大中小订阅 借鉴+创新=succes 我已调试成功,新手望指教 // hanoizjqendend.cpp : Defines the entry point for the console application. //zjq// 9:18/11/4/2009 //profit:先搭架构再填函数 // 递归的思想:一个出口+一个关系 // 函数入口是形参,出口是return(只有一个返回值)或指针||引用(直接改变内存值) // 注意全局变量的应用好处 // 灵活的思维+好的习惯 // return 0;和break;都有中断异情的作用,灵活用之 #include <iostream.h> #include <iomanip.h> #include <time.h> struct layer { int numOfTower; int Layer[12]; }; struct Hanoi { struct layer a; struct layer b; struct layer c; }; struct Hanoi H={1,{1,2,3,4,5,6,7,8,9,10,11,12},2, {0,0,0,0,0,0,0,0,0,0,0,0},3,{0,0,0,0,0,0,0,0,0,0,0,0}};//初始化////,/////;///// void hanoi(int n,struct layer*pre,struct layer*mid,struct layer*end); void displayOfNum(int n,struct layer*pre,struct layer*mid,struct layer*end);//步骤d数字显示 void move2end(int n_bottom,struct layer*pre,struct layer*mid,struct layer*end); int createHanoi(); void displayOfImage(int m,struct layer*pre,struct layer*mid,struct layer*end);//步骤d图像显示 void Delay(int seconds) ;//delay function void moveLayer(int m,struct layer*pre,struct layer*mid,struct layer*end);//塔层移动:改变layer值 void starplay(int m);//每次输出m个“*” int sumOfStep=0;//record the steps int n=0; struct layer*pre=&H.a; //initialization struct layer*mid=&H.b; //将柱子的编号地址交给指针 struct layer*end=&H.c; main() { n=createHanoi(); //创建的塔层数 hanoi(n,pre,mid,end); cout<<"总共步数:"<<sumOfStep<<endl; //setw(n) 右对齐<iomanip.h> return 0; } //汉诺塔递归函数 void hanoi(int n,struct layer*pre,struct layer*mid,struct layer*end) //修改一定是依据形参进行的,里面形参决定一切 //递归的同一个函数关系: //hanoi(int n,int*pre,int*mid,int*end) //只要将其他的要求解的函数对应的参数传 //递过来就好了 { if(n==1) //递归出口:初始值/初始步骤 { //递归一定要有出口 //this is important// displayOfNum(1,pre,mid,end); //函数运行到出口就回到下一步了 moveLayer(0,pre,mid,end); //记录塔层移动后的塔层分布,i.e layer的重新赋值 displayOfImage(0,pre,mid,end); } else { //递归精髓1个出口 + 1个f(n)与f(n-1)的关系 hanoi(n-1,pre,end,mid); //f(n)与f(n-1)的循环关系 move2end(n,pre,mid,end); //实为move2end(n,pre,end),中间mid是为了显示用的; hanoi(n-1,mid,pre,end); } } //步骤的数字显示 void displayOfNum(int n,struct layer*pre,struct layer*mid,struct layer*end) { cout<<(*pre).numOfTower<<"->"<<(*end).numOfTower<<endl; sumOfStep++; } //A底到C底--move2end void move2end(int n_bottom,struct layer*pre,struct layer*mid,struct layer*end) { cout<<(*pre).numOfTower<<"->"<<(*end).numOfTower<<endl; sumOfStep++; moveLayer(0,pre,mid,end); displayOfImage(0,pre,mid,end); } //创建汉诺塔 int createHanoi() { int m; //m: the layers of beginning start: cout<<"input the number of the hanoi tower(<12):"<<endl; cin>>m; if(m<1||m>12) { cout<<"the number is outflow,please input again:"<<endl; goto start; //return 0; } return m; } //图像显示 void displayOfImage(int m,struct layer*pre,struct layer*mid,struct layer*end) //显示有问题,未掉过顺序来 { for(m=0;m<n;m++) { if((*pre).numOfTower==1) starplay((*pre).Layer[m]); //(*pre).numOfTower来决定显示的顺序 else if((*mid).numOfTower==1) starplay((*mid).Layer[m]); else starplay((*end).Layer[m]); if((*pre).numOfTower==2) starplay((*pre).Layer[m]); //(*pre).numOfTower来决定显示的顺序 else if((*mid).numOfTower==2) starplay((*mid).Layer[m]); else starplay((*end).Layer[m]); if((*pre).numOfTower==3) starplay((*pre).Layer[m]); //(*pre).numOfTower来决定显示的顺序 else if((*mid).numOfTower==3) starplay((*mid).Layer[m]); else starplay((*end).Layer[m]); cout<<endl; } /////cout<<(*pre).Layer[0]<<"->"<<(*mid).Layer[2]<<endl; Delay(1); //动态渐近显示 //cout<<setw(3)<<"* "<<endl<<setw(3)<<"***"<<endl; } //塔层移动---分情况讨论,为零的情况有多种,1a=0,c=1 |2a=0,c=0 |3a=1,c=1 |4a=1,c=1 void moveLayer(int m,struct layer*pre,struct layer*mid,struct layer*end) { int i,j; for(i=m;i<n;i++) { if((*pre).Layer[n-1]==0) { i=n-1; break; } else if((*pre).Layer[i]!=0) break; } for(j=m;j<n;j++) { if((*end).Layer[n-1]==0) { j=n-1; break; } else if((*end).Layer[j]==0&&(*end).Layer[j+1]!=0) break; } (*end).Layer[j]=(*pre).Layer[i]; (*pre).Layer[i]=0; } //延时程序 void Delay(int seconds)//延时seconds秒的程序 入口 delay(int n),强制延时 { clock_t start=clock();//像计数器 clock_t lay=(clock_t)seconds*CLOCKS_PER_SEC; while((clock()-start)<lay); } //星星显示 void starplay(int j) { int maxLayer=2*n-1; int numOfOut=(2*j-1); int blankNum1=(maxLayer-numOfOut)/2;//空格数 int blankNum2=(maxLayer-numOfOut)/2; if(j!=0) { while(blankNum1!=0) { cout<<" "; blankNum1--; } while(numOfOut!=0) { cout<<"*"; numOfOut--; } while(blankNum2!=0) { cout<<" "; blankNum2--; } } else { while(maxLayer!=0) { cout<<" "; maxLayer--; } } }
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服