资源预览内容
第1页 / 共10页
第2页 / 共10页
第3页 / 共10页
第4页 / 共10页
第5页 / 共10页
第6页 / 共10页
第7页 / 共10页
第8页 / 共10页
第9页 / 共10页
第10页 / 共10页
亲,该文档总共10页全部预览完了,如果喜欢就下载吧!
资源描述
数据结构课程Project 3汉诺塔Type:IndividualProgrammer: Tester:Report Writer: Date of completion:2010/11/10第一章: 绪论问题背景描述汉诺塔游戏是这样的:有三个桩(桩 1,桩 2 和桩 3)和 N 个半径不同的盘子。初始所有的盘子按半径从小到大堆叠在桩 1 上,半径最小的盘子在最上面。规则:每次只可以移动一个桩上最顶端的盘子到另一个桩上,而且不可以把大盘子堆在小盘子上。问题是要把所有盘子移动到桩 3 上。每次用两个整数 a (1 #include#define STACKSIZE 10 /*动态分配堆栈存储量*/FILE *fp_in = NULL; /*输入文件指针*/FILE *fp_out = NULL; /*输出文件指针*/typedef struct int *base;int *top;int stacksize;stack; /*定义堆栈*/stack initstack(stack stake)stake.base=(int*)malloc(STACKSIZE*sizeof(int);if(!stake.base) exit(0);stake.top=stake.base;stake.stacksize=STACKSIZE;return stake; /*堆栈初始化*/stack push(stack stake,int plate)*stake.top+=plate;return stake; /*将 plate 压入堆栈*/stack pop(stack stake)if(stake.top!=stake.base) -stake.top;return stake; /*将栈顶元素弹出*/int getplate(stack stake)if(stake.top=stake.base) return 0;else return *(stake.top-1); /*若栈不空则返回栈顶元素,否则返回 0*/void destroysk(stack stake)free(stake.base); /*销毁栈*/void func(int n,int m) /*操作函数,处理一个测试样例*/int j=n,k=1,i,from,to,plate,topplate,law=1;stack stake3; /*定义一个栈顶数组*/for(i=0;i=1;j-) /*将 n 个盘子从大到小放入桩 1*/stake0=push(stake0,j);for(k=1;k=topplate&topplate!=0)fprintf(fp_out, -%dn,k);law=0;break; /*如果被移盘子号比目的桩原顶层盘大,无效移动,输出-k*/staketo-1=push(staketo-1,plate); /*将盘子移入该桩*/if(stake2.top-stake2.base)=n)fprintf(fp_out, %dn,k);break; /*成功将桩 1 所有盘子移到桩 3,输出k*/if(k#define N 4void main()int i,j,k,t;printf(大小为:%dn,N);for(j=0;jN;j+)for(i=0;iN;i+)t=(i+j)%N;for(k=0;kN;k+)printf(%d,(k+t)%N+1);printf(n);printf(n);
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号