牧师与野人渡河问题

编译环境

Dev C++ 5.6.1

windows 10

实验要求

实验代码

#include<cstdio>
#include<queue>
#include<vector>
#include<cstdlib>
#include<cstring>
using namespace std;
int n,c;//人数,船容量/*
**初始化函数
**初始化人数和船容量
*/
void init0()
{printf("Please input the number of people (n):____\b\b\b");scanf("%d",&n);printf("Please input the number of boats  (c):____\b\b\b");scanf("%d",&c);
}/*
**状态节点
*/
typedef struct NODE
{int mushiNum;int yerenNum;bool isStartPosition;int step;int father;
//  NODE();
//  NODE(int m,int y,bool i,int s,int f):mushiNum(m),yerenNum(y),isStartPosition(i),step(s),father(f){}
}node;/*
**为状态节点赋值
*/
void setData(node &a,int m,int y,bool i,int s,int f)
{a.mushiNum=m;a.yerenNum=y;a.isStartPosition=i;a.step=s;a.father=f;
}/*
** 打印状态节点
*/
void printData(node &a)
{printf("(%2d,%2d,%2d)",a.mushiNum,a.yerenNum,a.isStartPosition);
}/*
**判断是否人数合法
*/
bool isNumValid(int m,int y)
{if(m+y>c||m+y==0){return false;}if(m>0){if(m<y){return false;}else{return true; } }else{return true;}
}bool isCoastValid(int m,int y)
{if(m>0){if(m<y){return false;}else{return true; } }else{return true;}
}
/*
**数据处理函数
*/
void solution()
{node que[100000];int head=0,tail=1;setData(que[head],n,n,true,0,-1);bool flag=false;//未找到int shipBoardMushiNum;int shipBoardYerenNum;node tempNode;int tempi,tempj;bool isVisited[80][80][2];//该状态是否已经用过。memset(isVisited,false,sizeof(isVisited)); isVisited[n][n][1]=true;//该状态已用过。 while(head<tail){/***到达终态 */if(que[tail-1].mushiNum==0&&que[tail-1].yerenNum==0&&que[tail-1].isStartPosition==0){flag=true;}if(que[head].isStartPosition)//在开始岸边{for(int i=0;i<=c&&i<=que[head].mushiNum;i++)//上船的牧师人数 {for(int j=0;j<=c&&j<=que[head].yerenNum;j++)//上船的野人人数{if(!isNumValid(i,j))//船上的人数不合法{continue;}tempi=n-que[head].mushiNum+i;tempj=n-que[head].yerenNum+j;if(!isCoastValid(tempi,tempj))//对岸不合法{continue;}tempi=n-tempi;tempj=n-tempj;if(!isCoastValid(tempi,tempj))//初始岸边的人数不合法。 {continue;}if(isVisited[tempi][tempj][0]){continue;}else{isVisited[tempi][tempj][0]=true;}/***人数合法则入队**影藏一个名字在这 王会长 */setData(que[tail],tempi,tempj,false,que[head].step+1,head);tail++;if(que[tail-1].mushiNum==0&&que[tail-1].yerenNum==0&&que[tail-1].isStartPosition==0){flag=true;}if(flag){break;}}if(flag){break;}} if(flag){break;}} else//在对岸 {int duiani=n-que[head].mushiNum;int duianj=n-que[head].yerenNum;for(int i=0;i<=c&&i<=duiani;i++)//上船的牧师人数 {for(int j=0;j<=c&&j<=duianj;j++)//上船的野人人数{if(!isNumValid(i,j))//船上的人数不合法{continue;}tempi=duiani-i;tempj=duianj-j;if(!isCoastValid(tempi,tempj))//对岸不合法{continue;//ztwzyzyl}tempi=n-tempi;tempj=n-tempj;if(!isCoastValid(tempi,tempj))//初始岸边的人数不合法。 {continue;}if(isVisited[tempi][tempj][1]){continue;}else{isVisited[tempi][tempj][1]=true;}/***人数合法则入队*/setData(que[tail],tempi,tempj,true,que[head].step+1,head);tail++;if(que[tail-1].mushiNum==0&&que[tail-1].yerenNum==0&&que[tail-1].isStartPosition==0){flag=true;}if(flag){break;}}if(flag){break;}}if(flag){break;}}if(flag){break;}head++;}if(flag){int resSize=que[tail-1].step;int *res=(int *)malloc(resSize*sizeof(int));int k=tail-1;int cur=0;while(k>0){res[cur++]=k;k=que[k].father;}printf("\nThe cross way is:\n****");printData(que[0]);int hang=1;for(int i=resSize-1;i>=0;i--){if(hang%5==0){hang=1;printf("\n");}printf(" -> ");printData(que[res[i]]);hang++;} printf("\n\n%d steps can cross the river !\n",resSize);printf("Seccess !\n");free(res);}else{printf("imposible\n");}
}
int main()
{init0();solution();return 0;
}

运行截图

人工智能实验报告 牧师与野人渡河 知识表示方法相关推荐

  1. 人工智能实验二——prolog语言求解渡河问题(传教士和野人渡河,农夫渡河问题)实现详解

    农夫渡河问题求解 这两个问题都是渡河问题,思路和方式是一样的:给出求解Prolog代码: 问题描述 一个农夫带着一匹狼.一只羊.一颗白菜要过河, 只有一条船而且 农夫每次最多只能带一个动物或物品过河, ...

  2. 用python语言实现人工智能猴子摘香蕉的问题_人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次.docx...

    人工智能课内实验报告(8次)学 院: 自动化学院 班 级: 智能1501 姓 名: 刘少鹏(34) 学 号: 目 录课内实验1:猴子摘香蕉问题的VC编程实现--------1课内实验2:编程实现简单动 ...

  3. 用python语言实现人工智能猴子摘香蕉的问题_人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次 -...

    人工智能课内实验报告 (8次) 学 院:自动化学院 班 级: 智能1501 姓 名: 刘少鹏(34) 学 号:06153034 目 录 课内实验1:猴子摘香蕉问题的VC编程实现????????1 课内 ...

  4. 人工智能实验评价指标_人工智能实验报告.pdf

    <- 人工智能方向实习-> 实 习 报 告 专业: 计算机科学与技术 班级: 学号: 姓名: 江苏科技大学计算机学院 2016年 3 月 实验一 数据聚类分析 一.实验目的 编程实现数据聚 ...

  5. a星算法实现8数码问题c语言,A星算法求八数码问题实验报告.doc

    A星算法求八数码问题实验报告.doc 人工智能实验报告实验名称八数码问题姓名xx学号2012210 xx xx计算机学院 2014年1月14日1 实验目的 掌握A*的思想,启发式搜索,来求解在代价最小 ...

  6. 《人工智能》之《知识表示方法》

    教材:<人工智能及其应用>,蔡自兴等,2016m清华大学出版社(第5版) 参考书: <人工智能>之<知识表示方法> 1 状态空间法(State Space Repr ...

  7. C++——《算法分析与设计》实验报告——二分搜索算法

    实验名称: 二分搜索算法 实验地点: 实验目的: 理解分治算法的概念和基本要素: 理解递归的概念: 掌握设计有效算法的分治策略: 通过二分搜索技术学习分治策略设计技巧: 实验原理: 二分搜索算法也称为 ...

  8. 实验结果报告与实验总结_教科版科学四年级上册实验报告

    于茫茫书海中,为你寻找更适合自己成长的有效资源和那些锲入心灵的文字.与高人交心,轻松学习,把时间留给更重要的人更重要的事. 精彩就点击右上角分享出去,赠人玫瑰手染余香. 严正声明本系列教科版四上科学实 ...

  9. 20155235 信息安全技术概论 第二次实验报告

    20155235 信息安全技术概论 第二次实验报告 实验原理 一.口令破解方法 口令破解主要有两种方法:字典破解和暴力破解. 字典破解是指通过破解者对管理员的了解,猜测其可能使用某些信息作为密码,例如 ...

最新文章

  1. SVM学习(四):为何需要核函数
  2. 在vs2012下编译出现Msvcp120d.dll 丢失的问题
  3. iOS之深入解析Block的使用和外部变量捕获
  4. strcpy和strncpy
  5. python免费学校_清华大学,的python学习路线,免费分享给小白福利
  6. NFS 故障排错指南
  7. Ant Design引入Echarts
  8. python实现生日祝福短信_Python实现好友生日提醒
  9. js实现敏感词过滤算法
  10. [java]房屋出租系统
  11. [BZOJ]1228: [SDOI2009]ED 博弈SG
  12. 自动注册gmail邮箱构想
  13. c语言中指数对数函数,在C语言中使用对数函数的方法
  14. SpringBoot整合SpringSecurity+JWT实现系统认证、授权
  15. 厨房里的ERP(MRP)
  16. 适合在企业网站展示企业发展历程的时间轴滑动特效源码
  17. Word 使用宏根据文件名实现文件版本号自动更新_rev00
  18. 常见模拟电路设计 三(含仿真) :文氏桥正弦波发生电路
  19. 系统错误H80004005(-2147467259),未指定的错误。
  20. LA2402 Fishnet 四边形面积

热门文章

  1. vue实现简单搜索功能
  2. html+css精致的登录页面 (含源码的哦)
  3. Oracle Acs资深顾问罗敏 老罗技术核心感悟:11g的数据压缩技术
  4. URL Protocol- -(coolice)
  5. SpringBoot整合Shiro搭建登录注册认证授权权限项目模板
  6. 连接阿里云RDS数据库报错
  7. idea 使用自动注解时候红色警告的消除办法
  8. mysql异常Incorrect string value: ‘\xE6\xB5\x8B\xE8\xAF\x95‘ for column ‘region_name‘
  9. 卓训教育:孩子不爱学习怎么办,如何让孩子将动力内化
  10. untiy2020 与 HubSetup 安装教程