汉诺塔课程设计
❶ vb编程:汉诺塔
这个程序难度不小,估计是个课程设计或是毕业设计之类的,我建议你还是自己先动手做,当遇到问题再提出来大家帮忙。不是一个人一两天能做出来的,只要开始去做,好的开始是成功的一半。
❷ 急求汉诺塔演示的C语言课程设计报告啊
而且必须用到双递归,我用汇编语言做了两天才做完,最重要一点,双递归
❸ 谁会用C语言解决汉诺塔问题请进,最好把每一步的解释写上。
#include <graphics.h>
struct H
{
int data[15];/*存放每个盘的代号*/
int top;/*每个塔的具体高度*/
}num[3];/*三个塔*/
void move(char x,char y,struct H num[3]);/*移动的具体过程*/
void hanoi(char x,char y,char z,int n,struct H num[3]);/*递归*/
void Init(void);/*初始化*/
void Close(void);/*图形关闭*/
int computer=1;/*自动控制与手动控制的标志*/
int speed=0;/*全局变量speed主要是演示过程的速度*/
void main(void)
{
Init();/*初始状态*/
Close();/*图形关闭*/
exit(0);
getch();
}
void Init(void)/*初始化*/
{
int gd=DETECT,gm;
int i,n,color;
clrscr();
printf("please input n(n<=10): ");/*输入要演示的盘子数*/
scanf("%d",&n);
printf("Please input 1 or 2:\n1.computer 2.people\n");
scanf("%d",&i);
if(i==2)/*选择手动控制标志为0*/
computer=0;
if(n<1||n>10)
n=10;/*越界的话n当10处理*/
if(computer)/*如果是自动控制的话输入速度*/
{
printf("please input speed: ");/*输入速度*/
scanf("%d",&speed);
}
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
for(i=0;i<3;i++)
num[i].top=-1;/*三个地方的高度开始都为-1*/
for(i=0;i<n;i++)/*画一开始的塔座A上的盘子*/
{
num[0].top++;/*栈的高度加1*/
num[0].data[num[0].top]=i; /*最大的盘子代号为0,依次为1,2,…n-1*/
color=num[0].data[num[0].top]+1;/*盘子的颜色代码为栈顶盘子代号加1*/
setfillstyle(SOLID_FILL,color);
bar(100-(33-3*num[0].data[num[0].top]),400-20*i-8,100+
(33-3*num[0].data[num[0].top]),400-20*i+8); /*画矩形*/
}
setcolor(YELLOW);
outtextxy(180,450,"any key to continue");
settextstyle(0,0,2);
outtextxy(90,420,"A"); /*塔座标志*/
outtextxy(240,420,"B");
outtextxy(390,420,"C");
getch();/*接收字符后就执行递归操作*/
hanoi('a','b','c',n,num);
}
void move(char x,char y,struct H num[3])/*移动的具体过程*/
{
int i;
char num1[3],num2[3];
sprintf(num1,"%c",x-32);/*将小写变成大写,并转换成字符串输出*/
sprintf(num2,"%c",y-32);
setfillstyle(SOLID_FILL,BLACK);/*把原来的地方移去涂黑*/
bar(0,0,640,60);
setcolor(RED);
outtextxy(150,30,num1);/*输出移动过程*/
outtextxy(200,30,"--->");
outtextxy(310,30,num2);
settextstyle(0,0,2);
setfillstyle(SOLID_FILL,BLACK);/*把原来的地方移去涂黑*/
bar(100+150*(x-97)-(33-3*num[x-97].data[num[x-97].top]),
400-20*num[x-97].top-8,100+150*(x-97)+(33-3*
num[x-97].data[num[x-97].top]),400-20*num[x-97].top+8);
num[y-97].top++;/*入栈,目标点的top加1*/
num[y-97].data[num[y-97].top]=num[x-97].data[num[x-97].top];/*在目标点盘子的代号与源点盘子的代号相同*/
num[x-97].top--;/*出栈,原来地方的top减1*/
setfillstyle(SOLID_FILL,num[y-97].data[num[y-97].top]+1);/*盘子颜色代码是栈顶盘子代号加1*/
bar(100+150*(y-97)-(33-3*num[y-97].data[num[y-97].top]),
400-20*num[y-97].top-8,100+150*(y-97)+
(33-3*num[y-97].data[num[y-97].top]),400-20*num[y-97].top+8);
if(computer)/*自动控制就用delay*/
delay(speed);/*延时函数*/
else
getch();/*手动控制的话就自己按键盘来控制*/
}
void hanoi(char one,char two,char three,int n,struct H num[3])/*递归n为盘子数,num为堆栈*/
{
if(n==1)
move(one,three,num);/*如果盘子为1,将这个盘子从塔座A移动到塔座C*/
else
{
hanoi(one,three,two,n-1,num);/*将塔座A的前n-1个盘子移到塔座B*/
move(one,three,num);/*将塔座A的第n个盘子移到塔座C*/
hanoi(two,one,three,n-1,num); /*将塔座B的n-1个盘子移到塔座C*/
}
}
void Close(void)/*图形关闭*/
{
getch();
closegraph();
}
❹ C语言课程设计答案
#include<stdio.h>
void hanoi(int n,char a,char b,char c);//移动盘子
void move(int num,char fron,char to);//显示盘子移动次数
main()
{
int n;
printf("输入盘子数:");
scanf("%d",&n);
printf("移动盘子的步数:\n",n);
hanoi(n,'A','B','C');
}
void hanoi(int n,char a,car b,char c)
{
if(n==1) { move(n,a,b)};//盘子从a移动到b
else {
hanoi(n-1,a,c,b);//将第版n-1个盘子,借权助于b由a移动到c
move(n,a,b);//第n个盘子由a-》b
hanoi(n-1,c,b,a);//将第n-1个盘子,借助于a由c移动到b
}
}
void move(int num,char from,char to)
{
printf("move %d:form %c to %c \n",num,form,to);
}
❺ 数据结构课程设计的图书目录
第1章 数据结构课程设计概述
1. 数据结构简介
1.2 课程设计目标和特点
1.3 编写说明
1.4 课程设计实例的标准格式
第2章 线性表的应用
2.1 存储结构与基本运算的算法
2.2 集合的交、并运算
2.3 学生成绩管理
2.4 多项式求导
2.5 约瑟夫环问题
2.6 数据库管理系统
第3章 栈的应用
3.1 存储结构与基本运算的算法
3.2 括号匹配
3.3 汉诺塔问题
3.4 算术表达式求值
3.5 马踏棋盘
第4章 队列的应用
4.1 存储结构与基本运算的算法
4.2 看病排队候诊问题
4.3 数制的转换
4.4 停车场管理
4.5 基数排序
第5章 串的应用
5.1 存储结构与基本运算的算法
5.2 KMP算法
5.3 最长公共子串
5.4 大整数计算器
第6章 多维数组和广义表的应用
6.1 存储结构与基本运算的算法
6.2 魔方阵
6.3 稀疏矩阵的加法运算
6.4 本科生导师制问题
第7章 树状结构的应用
7.1 存储结构与基本运算的算法
7.2 线索二叉树的创建与遍历
7.3 由遍历确定二叉树
7.4 电文的编码和译码
7.5 家族关系查询系统
第8章 图状结构的应用
8.1 存储结构与基本运算的算法
8.2 地铁建设问题
8.3 安排教学计划
8.4 校园导航
附录A 课程设计实例软件包
参考文献
❻ 怎么用归纳法证明汉诺塔问题 算法设计与分析的课后习题
如果来柱子标为ABC,要由A搬至C,在自只有一个盘子时,就将它直接搬至C,当有两个盘子,就将B当作辅助柱。
如果盘数超过2个,将第三个以下的盘子遮起来,就很简单了,每次处理两个盘子,也就是:A->B、A ->C、B->C这三个步骤,而被遮住的部份,其实就是进入程式的递回处理。
事实上,若有n个盘子,则移动完毕所需之次数为2^n - 1
演算法Procere HANOI(n, A, B, C) [
IF(n == 1) [
PRINT("Move sheet " n " from " A " to " C);
]
ELSE [
HANOI(n-1, A, C, B);
PRINT("Move sheet " n " from " A " to " C);
HANOI(n-1, B, A, C);
]
]
❼ 本人有汉诺塔的 程序,麻烦大家调试一下发几张运行图片过来!
你试试能不能运行
/*5. 源程序*/
/********hanoi.c*********/
#include <graphics.h>
struct H
{
int data[15];/*存放每个盘的代号*/
int top;/*每个塔的具体高度*/
}num[3];/*三个塔*/
void move(char x,char y,struct H num[3]);/*移动的具体过程*/
void hanoi(char x,char y,char z,int n,struct H num[3]);/*递归*/
void Init(void);/*初始化*/
void Close(void);/*图形关闭*/
int computer=1;/*自动控制与手动控制的标志*/
int speed=0;/*全局变量speed主要是演示过程的速度*/
void main(void)
{
Init();/*初始状态*/
Close();/*图形关闭*/
exit(0);
}
void Init(void)/*初始化*/
{
int gd=DETECT,gm;
int i,n,color;
clrscr();
printf("please input n(n<=10): ");/*输入要演示的盘子数*/
scanf("%d",&n);
printf("Please input 1 or 2:\n1.computer 2.people\n");
scanf("%d",&i);
if(i==2)/*选择手动控制标志为0*/
computer=0;
if(n<1||n>10)
n=10;/*越界的话n当10处理*/
if(computer)/*如果是自动控制的话输入速度*/
{
printf("please input speed: ");/*输入速度*/
scanf("%d",&speed);
}
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
for(i=0;i<3;i++)
num[i].top=-1;/*三个地方的高度开始都为-1*/
for(i=0;i<n;i++)/*画一开始的塔座A上的盘子*/
{
num[0].top++;/*栈的高度加1*/
num[0].data[num[0].top]=i; /*最大的盘子代号为0,依次为1,2,…n-1*/
color=num[0].data[num[0].top]+1;/*盘子的颜色代码为栈顶盘子代号加1*/
setfillstyle(SOLID_FILL,color);
bar(100-(33-3*num[0].data[num[0].top]),400-20*i-8,100+
(33-3*num[0].data[num[0].top]),400-20*i+8); /*画矩形*/
}
setcolor(YELLOW);
outtextxy(180,450,"any key to continue");
settextstyle(0,0,2);
outtextxy(90,420,"A"); /*塔座标志*/
outtextxy(240,420,"B");
outtextxy(390,420,"C");
getch();/*接收字符后就执行递归操作*/
hanoi('a','b','c',n,num);
}
void move(char x,char y,struct H num[3])/*移动的具体过程*/
{
int i;
char num1[3],num2[3];
sprintf(num1,"%c",x-32);/*将小写变成大写,并转换成字符串输出*/
sprintf(num2,"%c",y-32);
setfillstyle(SOLID_FILL,BLACK);/*把原来的地方移去涂黑*/
bar(0,0,640,60);
setcolor(RED);
outtextxy(150,30,num1);/*输出移动过程*/
outtextxy(200,30,"--->");
outtextxy(310,30,num2);
settextstyle(0,0,2);
setfillstyle(SOLID_FILL,BLACK);/*把原来的地方移去涂黑*/
bar(100+150*(x-97)-(33-3*num[x-97].data[num[x-97].top]),
400-20*num[x-97].top-8,100+150*(x-97)+(33-3*
num[x-97].data[num[x-97].top]),400-20*num[x-97].top+8);
num[y-97].top++;/*入栈,目标点的top加1*/
num[y-97].data[num[y-97].top]=num[x-97].data[num[x-97].top];/*在目标点盘子的代号与源点盘子的代号相同*/
num[x-97].top--;/*出栈,原来地方的top减1*/
setfillstyle(SOLID_FILL,num[y-97].data[num[y-97].top]+1);/*盘子颜色代码是栈顶盘子代号加1*/
bar(100+150*(y-97)-(33-3*num[y-97].data[num[y-97].top]),
400-20*num[y-97].top-8,100+150*(y-97)+
(33-3*num[y-97].data[num[y-97].top]),400-20*num[y-97].top+8);
if(computer)/*自动控制就用delay*/
delay(speed);/*延时函数*/
else
getch();/*手动控制的话就自己按键盘来控制*/
}
void hanoi(char one,char two,char three,int n,struct H num[3])/*递归n为盘子数,num为堆栈*/
{
if(n==1)
move(one,three,num);/*如果盘子为1,将这个盘子从塔座A移动到塔座C*/
else
{
hanoi(one,three,two,n-1,num);/*将塔座A的前n-1个盘子移到塔座B*/
move(one,three,num);/*将塔座A的第n个盘子移到塔座C*/
hanoi(two,one,three,n-1,num); /*将塔座B的n-1个盘子移到塔座C*/
}
}
void Close(void)/*图形关闭*/
{
getch();
closegraph();
}
❽ 数据结构汉诺塔问题
#include <stdio.h>move(int n,int x,int y, int z)
{
if(n == 1)
printf("%c柱--->%c柱\n",x,z);
else
{
move(n-1,x,z,y);
printf("%c柱--->%c柱\n",x,z);
move(n-1,y,x,z);
}
}int main()
{
int num;
printf("请输入圆盘的数量:\n");
scanf("%d",&num);
printf("移动%d个盘回子的步骤如下答:\n");
move(num,'A','B','C');
return 0;
}
❾ 计算机行业用人要求
今天上午又去招聘了,加上前面一段时间的招聘经验,有些话不吐不快
我们希望找到能干活的人,就是能编程序的人,但是我感觉现在刚毕业的人里面,包括名校的,能干活的人比例非常的低,大概不超过百分之一
很多人都说,没有参加过实际的项目,没有经验,希望能够在工作过程中学习等等,开始的时候我也这样认为,随着面试的人的增多,手下新人的增多,我的看法逐渐变了
不谈个人主观能动性方面的种种问题,我想谈谈我心目当中的科班出身编程序选手的及格线
如果你希望编程序为生的话,那么,大学才是你最重要的经验积累地点,相反,工作单位能够积累的东西很少,或者说绝对是第二位的
大学里面,最重要的课程有两门,一门是编译原理,一门是数据结构,这两门课的课程都不重要,重要的是课程设计,也就是老师让你上机做的题目,就我这段时间面试的上百人来说,我认为其中的九十九个,这两门课的课程设计要么是直接复制别人的,要么是蒙混过关的[只碰到一个真刀真枪作过的],其实,这两门课是你大学里所有学习内容当中对编程序的能力进行训练的最根本内容,也是你在社会上永远碰不到的学习机会,任何,不论多贵的培训机构,也不可能给你提供这两门课的训练深度,我见过太多的毕业之后又花一两万块参加各种形式的培训机构培训一年的选手了,你学会一万种框架的配置方法,也不如你大学的时候把这两门课上好有意义
编译原理的课程设计,一般来说要求做一个词法分析器或者语法分析器,最屁要你做一个数学公式的逆波兰式解析,我个人看法词法分析器或者语法分析器都可以,单作逆波兰式,则最好能够做到支持各种类型的运算的地步,比如逻辑运算等等,这门课的课程设计如果能够独立完成,可以在你的大脑里面创建一个整体化的计算机思考方式,最重要的是,这个过程能够让你学会面对一个复杂问题的时候,如何通过各种计算机语言来解决问题,、、、,好处不再列举,其实你毕业之后参加的任何培训,其算法复杂程度都不可能和这门课程相比
数据结构的课程设计,关键点在于两个,一个是数据结构和算法本身,这里需要理解和学习的主要内容是循环和递归等等,其实如果你上面一个做得好,这些都不是太大问题了,学习一下各种数据结构的应用还有些意义;第二个最重要的训练目的,就是如何在计算机当中表达问题的问题,很多人跟我说,我的课程设计是二叉树排序,输入就是我自己输进去一堆数字,输出就是把这些数字排好了再输出到屏幕上、、、faint,晕倒,讲一个汉诺塔的例子吧:
汉诺塔本身的算法只有二十几行,不太好理解,但是也不难理解,那么,如果希望做一个东西,把汉诺塔表达一下,应该考虑什么东西呢?
首先,需要考虑清楚几个塔,个个盘子,应该用什么表达,用什么数据结构表达?这个是一个关键问题,需要能够把塔和盘子和数组以及数组里面的元素对应起来思考问题,不要看这一点简单,实际上太多人根本就没有办法在大脑里面完成这个转换、、
其次,要考虑清楚其中有哪些元素可能发生变化,盘子的数目是最简单的变化元素了,有没有其它的了呢?
有,移动的速度,如果你移动得太快,那么谁也看不清楚,你等于什么也没做、、那么,至少两个元素要可变,一个是移动速度,一个是盘子数目
好,轮到表达方式了,你要是牛的话,就画成棍子上面穿着有洞的盘子,不行的话就竖线上面穿横线,移动的过程,牛的话做成动画??不行的话就演示每个步骤地结果既可
好,该怎么画出来呢,这个时候你就要弄明白如何在屏幕上划线,这个简单,重要的是如何擦掉一条线,还不能把棍子的那个点擦掉,这就有点问题了、、
好了,上面问题都解决完毕之后,用什么语言编程序就很次要了,c也好,pascal,java,任何语言,一个带两个参数的动画演示汉诺塔的东东就出世了、、、[我花了一个半小时]
数据结构的学习过程中,如果能够在四五个题目上面做到上面的深度,相信你绝对受欢迎
以上两个课程设计,如果都能够独立完成,一般来说毕业后两三年内收入必然超过五千,如果在北京上海,应该可以肯定超过一万
❿ 汉诺塔问题
so easy.................................................................................................................................................................