人工智能二_野人过河问题_实验3.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
void recorder();
int main()
{
int flag; /*标记扩展是否成功*/
for( ; ; )
{
initiate();
flag = search ();
if(flag == 1)
{
recorder();
releasemem();
showresult();
goon();
}
else
printf("题目:设有n个传教士和m个野人来到河边,打算乘一只船从右岸到左岸去。\n");
printf("该船的负载能力为两人。在任何时候,如果野人人数超过传教士人数,野人\n");
printf("就会把传教士吃掉。他们怎样才能用这条船安全的把所有人都渡过河去?\n");
printf("\n默认的n、m值皆为3\n");
int sl,pl; /*船运行一个来回后河左岸的野人、传教士的人数*/
int ssr,spr; /*回来(由左向右时)船上的人数*/
int sst,spt; /*去时(由右向左时)船上的人数*/
int loop; /*本结点所在的层数*/
struct SPQ *upnode ,*nextnode;/*本结点的父结点和同层的下一个结点的地址*/
for(;;)
{
printf("\n是否修改?(Y/N)");
scanf("%s",&choice);
choicewk.baidu.comtoupper(choice);
if(choice=='Y')
{
printf("\n请输入传教士人数");
for(;;)
{
scanf("%d",&x);
if(x>0)
{
unopened -> pr = x;
unopened -> pr = pristnum;
unopened -> sl = 0;
unopened -> pl = 0;
unopened -> sst = 0;
unopened -> spt = 0;
unopened -> ssr = 0;
unopened -> spr = 0;
unopened -> loop = 0;
{
printf("无法找到符合条件的解");
releasemem();
goon();
}
}
system("pause");
return 0;
}
void initiate()
{
int x;
char choice;
uend = unopened = (struct SPQ*)malloc(sizeof(spq));
}
break;
}
if(choice=='N')break;
}
}
int search()
{
int flag;
struct SPQ *ntx; /*提供将要扩展的结点的指针*/
for( ; ; )
{
ntx = unopened; /*从待扩展链表中提取最前面的一个*/
if(ntx->loop == maxloop)
{
int fsr , fpr ; /*在右岸上的人数*/
int fsl , fpl ; /*在左岸上的人数*/
if(uend==NULL)
{
printf("\n内存不够!\n");
exit(0);
}
unopenednum=1;
openednum=0;
unopened -> upnode = unopened; /*保存父结点的地址以成链表*/
unopened -> nextnode = unopened;
unopened -> sr = slavenum;
}spq;
int loopnum;/*记录总的扩展次数*/
int openednum;/*记录已扩展节点个数*/
int unopenednum;/*记录待扩展节点个数*/
int resultnum;
struct SPQ *opened;
struct SPQ *oend;
struct SPQ *unopened;
struct SPQ *uend;
struct SPQ *result;
void initiate();
void releasemem();
void showresult();
void addtoopened(struct SPQ *ntx);
int search();
void goon();
int stretch(struct SPQ* ntx);
实验报告
课程名称人工智能_____________
实验项目野人过河问题_______________
实验仪器电脑、visual C++_________
系 别计算机学院____________
专 业__计算机科学与技术_____
班级/学号
学生姓名_ __
实验日期2010年 月 日_______
成 绩_______________________
指导教师
一、实验目的
理解并熟悉掌握深度优先搜索和广度优先搜索地方法。
二、实验内容
题目:设有3个传教士和3个野人来到河边,打算乘一只船从右岸到左岸去。该船的负载能力为两人。在任何时候,如果野人人数超过传教士人数,野人就会把传教士吃掉。他们怎样才能用这条船安全的把所有人都渡过河去?
三、代码和结果
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define maxloop 100 /*最大层数,对于不同的扩展方法自动调整取值*/
#define pristnum 3 /*初始化时设定有3个野人3个传教士,实际可以改动*/
#define slavenum 3
struct SPQ{ int sr,pr; /*船运行一个来回后河右岸的野人、传教士的人数*/
return 0;
addtoopened(ntx); /*将ntx加入已扩展链表,并将这个节点从待扩展链表中去掉*/
flag = stretch(ntx); /*对ntx进行扩展,返回-1,0,1 */
if(flag == 1)
return 1;
}
}
int stretch(struct SPQ *ntx)
break;
}
else printf("\n输入值应大于0!\n请重新输入");
}
printf("\n请输入野人人数");
for(;;)
{
scanf("%d",&x);
if(x>0)
{
unopened -> sr = x;
break;
}
else printf("\n输入值应大于0!\n请重新输入");
相关文档
最新文档