人工智能二_野人过河问题_实验3. 下载本文

实 验 报 告

课程名称 人工智能_____________ 实验项目 野人过河问题_______________ 实验仪器 电脑 、visual C++_________

系 别 计算机学院____________ 专 业 __计算机科学与技术_____ 班级/学号 学生姓名 _ __

实验日期 2010年 月 日_______ 成 绩 _______________________ 指导教师

一、 实验目的

理解并熟悉掌握深度优先搜索和广度优先搜索地方法。

二、 实验内容

题目:设有3个传教士和3个野人来到河边,打算乘一只船从右岸到左岸去。 该船的负载能力为两人。在任何时候,如果野人人数超过传教士人数,野人 就会把传教士吃掉。他们怎样才能用这条船安全的把所有人都渡过河去?

三、代码和结果

#include #include #include

#define maxloop 100 /* 最大层数,对于不同的扩展方法自动调整取值 */ #define pristnum 3 /*初始化时设定有3个野人3个传教士,实际可以改动*/ #define slavenum 3

struct SPQ{ int sr,pr; /* 船运行一个来回后河右岸的野人、传教士的人数 int sl,pl; /* 船运行一个来回后河左岸的野人、传教士的人数 */ int ssr,spr; /* 回来(由左向右时)船上的人数 */ int sst,spt; /* 去时(由右向左时)船上的人数 */

int loop; /* 本结点所在的层数 */

struct SPQ *upnode ,*nextnode;/* 本结点的父结点和同层的下一个结点的地址 */ }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); void recorder();

int main() {

*/

int flag; /* 标记扩展是否成功 */ for( ; ; ) {

initiate();

flag = search (); if(flag == 1) {

recorder(); releasemem(); showresult(); goon(); }

else {

printf(\无法找到符合条件的解\ releasemem(); goon(); } }

system(\ return 0; }

void initiate() {

int x;

char choice;

uend = unopened = (struct SPQ*)malloc(sizeof(spq)); if(uend==NULL) {

printf(\内存不够!\\n\ exit(0); }

unopenednum=1; openednum=0;

unopened -> upnode = unopened; /* 保存父结点的地址以成链表 */ unopened -> nextnode = unopened; unopened -> sr = slavenum; 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(\题目:设有n个传教士和m个野人来到河边,打算乘一只船从右岸到左岸去。\\n\

printf(\该船的负载能力为两人。在任何时候,如果野人人数超过传教士人数,野人\\n\ printf(\就会把传教士吃掉。他们怎样才能用这条船安全的把所有人都渡过河去?\\n\ printf(\默认的n、m值皆为3\\n\ for(;;) {

printf(\是否修改?(Y/N)\ scanf(\ choice=toupper(choice); if(choice=='Y') {

printf(\请输入传教士人数\ for(;;) {

scanf(\ if(x>0) {

unopened -> pr = x; break; }

else printf(\输入值应大于0!\\n请重新输入\ }

printf(\请输入野人人数\ for(;;) {

scanf(\ if(x>0) {

unopened -> sr = x; break; }

else printf(\输入值应大于0!\\n请重新输入\ }

break; }

if(choice=='N')break; } }

int search()