1 / 14
文档名称:

人工智能(梵塔问题).pdf

格式:pdf   大小:503KB   页数:14页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

人工智能(梵塔问题).pdf

上传人:fuxiyue 2025/4/20 文件大小:503 KB

下载得到文件列表

人工智能(梵塔问题).pdf

相关文档

文档介绍

文档介绍:该【人工智能(梵塔问题) 】是由【fuxiyue】上传分享,文档一共【14】页,该文档可以免费在线阅读,需要了解更多关于【人工智能(梵塔问题) 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。 : .
人工智能
梵塔问题实验报告
实验目的
1. 熟悉和掌握问题规约法的原理、实质和规约过程
2. 理解规约图的表示方法
3. 熟悉并掌握递归解决问题的思想
实验原理
1. 利用问题规约法的原理进行问题的分析与描述
2. 利用递归思想进行问题的解决
实验条件
1. Window NT/xp/7 及以上的操作系统
2. 内存在 512M 以上
3. CPU 在奔腾 II 以上
实验内容
梵塔问题源于印度古老的一个传说。相传开天辟地的神勃拉玛创造世界时在
印度北部的佛教圣地的圣庙里,安放了三根金刚石的棒,第一根上面套着 64 个
圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不
倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮
助,但每次只能搬一个,而且大的不能放在小的上面。值班僧侣按照法则日夜不
停地搬运,当搬运完成时世界将在一声霹雳中毁灭。










实验分析
我们假设把该任务交给一个僧人,为了方便叙述,将他编号为 64。僧人自然
1 : .
人工智能
会这样想:假如有另外一个僧人能有办法将 63 个盘子从一个座移到另一个座,
那么问题就解决了,此时僧人 64 只需这样做:
1. 命令僧人 63 将 63 个盘子从 A 座移到 C 座
2. 自己将最底下的最大的一个盘子从 A 座移到 C 座
3. 再命令僧人 63 将 63 个盘子从 B 座移到 C 座
为了解决将 63 个盘子从 A 座移到 B 座的问题,僧人 63 又想:如果能再有一
个僧人 62 能将 62 个盘子移动到另一座,我就能将 63 个盘子从 A 座移动到 B 座。
他是这样做的:
1. 命令僧人 62 将 62 个盘子从 A 移动到 C
2. 自己将一个盘子从 A 座移动到 B 座
3. 再命令僧人 62 将 62 个盘子移到 B 座
再进行一次递归。如此“层层下放”,直到后来找到第 2 个僧人,让他完成
将 2 个盘子从一个座移到另一个座,进行到此,问题就解决了。最后找到第 1
个僧人,让他完成将一个盘子从一个座移动到另一个座,至此,全部工作已经完
成,该烦他问题得到解决。
实验步骤
⑴ 主程序流程图

开始

输入盘子数

初始化过程

绘制初始图形

汉诺塔求解

结束

主程序流程图


⑵ 梵塔求解流程图


2 : .
人工智能
开始
盘子数为 n
是 否
n 为 1?
将盘子从 A 座移到 C 座 递归调用,初始 n=n-1
退出一级调用 n=n+1
结束
梵塔问题递归过程流程图


程序代码
#include <>
#include <>
#include <>
#include <>
#include <>
#define PAOGAO 190 /*动画抛高,数值越小越高*/
#define PANHOU 10
/*#define PANAMOUNT 19盘子数*/
int PANAMOUNT;
typedef int pans;
typedef struct s_pillar
{
int amount;
int x,y;
pans pan[20]; /*存放每个盘的代号*/
}pillars;
pillars pillar[4]; /*三个台柱*/
int movecount=0; /*移动计数*/
void drawpillar(pillars p);
void init(); /*初始化函数*/
void drawmat(char *mat,int matsize,int x,int y,int color); /* 点陈汉字 */
void drawpan(pans p,int x,int y);
3 : .
人工智能
void zimu(); /*显示字幕*/
void drawpps(); /*画装盘的台柱*/
void hanoi(); /*主算法*/
void hanoi(int n,char one,char two,char three);
void sdelay(int delay_t); /*函数申明*/
void finish(); /*完成!*/

void main(void) /*主函数*/
{

printf("\n\tplease input n(n<=19): ");/*输入要演示的盘子数*/
scanf("%d",&PANAMOUNT);
if(PANAMOUNT<1||PANAMOUNT>19) /*越界的话 n 当 19 处理*/
PANAMOUNT=19 ;
init();
drawpps();
hanoi(PANAMOUNT,'a','b','c');
finish();
}

void init() /* 初始化函数 */
{
int gd=DETECT,gm ;
int i,n,color ;
clrscr();
initgraph(&gd,&gm,"c:\tc");
cleardevice();

pillar[1].amount = PANAMOUNT;
pillar[1].x = 105;
pillar[1].y = 405;
for(i=1;i<=pillar[1].amount;i++)
{
pillar[1].pan[i]=pillar[1].amount-i+1;
}

pillar[2].amount = 0;
pillar[2].x = 320;
pillar[2].y = 405;
pillar[3].amount = 0;
pillar[3].x = 527;
pillar[3].y = 405;
setcolor(YELLOW); /*柱座标记*/
settextstyle(0,0,2);
4 : .
人工智能
outtextxy(105,418,"A");
outtextxy(320,418,"B");
outtextxy(527,418,"C");
setcolor(YELLOW); /*画框*/
setlinestyle(SOLID_LINE,0,NORM_WIDTH);
line(0,0,0,479);
line(0,0,639,0);
line(639,0,639,479);
line(0,479,639,479);
line(0,PAOGAO-PANHOU-40,450,PAOGAO-PANHOU-40); /*黄金线*/
settextstyle(0,0,1);
outtextxy(250,PAOGAO-PANHOU-50,"Press ANY Key to EXIT !"); /*线上字*/
zimu();
}

void drawpillar(pillars p) /*画柱*/
{
int x,y,mount;
x=;
y=;