请将下面这个例子设计成一个状态搜索系统,(1)分析采用宽度优先和深度优先方法分别进行搜索,写出搜索的过程及搜索路径(可以画图来分析)(2)采用C语言或Python编程实现(代码中适当加注释,输出具有可读性)。

问题描述:设有m个传教士和n个野人来到河边,打算乘一只船从左岸渡到右岸去,该船每次最多载3人。在任何时候,如果野人人数超过传教士人数,那么野人就会把传教士吃掉。他们怎样才能用这条船安全地把所有人都渡河过去?试采用宽带优先和深度优先方法分析搜索过程。(说明:传教士和野人都会划船,测试:m=n=3)

思路:
首先肯定要建立一个操作集(存储所有操作算子)和目前状态变量(并附上一个bool函数判断此时状态是否可以进行某些操作)以及一个变量存储是往左走还是往右走,用一个vector存储所有走过的状态,深度遍历时按照不同操作往里面push元素并递归到下一状态里,若遇到所有操作不可行,则pop掉这个元素。而这个状态变量如何定义呢?初设定为(al,bl,ar,br),其中分别为传教士、野人在左右两岸的数量,那么二者在船上的数量可以通过m-al-ar,n-bl-br来计算。
代码:

#include<iostream>
#include<vector>
#include<unordered_set>
using namespace std;
int operatora[8]={1,2,3,0,0,0,1,2};//做某操作时传教士变化数量
int operatorb[8]={0,0,0,1,2,3,1,1};//做某操作时野人变化数量
struct state{int al,bl,ar,br;bool operator==(state s2){if(this->al==s2.al&&this->ar==s2.ar&&this->bl==s2.bl&&this->br==s2.br) return true;else return false;}
};
vector<state> v;
bool Can(state s,int a,int b,int flag){  //判断现在状态是否能做某操作,flag表示左右,1往右,0往左 bool vis=false;for(int i=0;i<v.size()-1;i++){  //看看之前的轨迹里是否走过该情况,若有,则不走 if(v[i]==s) vis=true;}if(vis) return false;//看看变化后的量是否正常,能不能做该操作 if(flag==1){ if(s.al>=a&&s.bl>=b&&((s.ar+a)>=(s.br+b)||(s.ar+a)==0||(s.br+b)==0)&&((s.al-a)>=(s.bl-b)||(s.al-a)==0||(s.bl-b)==0)) return true;//&&(a>=b||a==0)不知道是否需要 }else{if(s.ar>=a&&s.br>=b&&((s.al+a)>=(s.bl+b)||(s.al+a)==0||(s.bl+b)==0)&&((s.ar-a)>=(s.br-b)||(s.ar-a)==0||(s.br-b)==0)) return true;//&&(a>=b||a==0)不知道是否需要 }return false;
}
int m,n;
void DFS(state s,int flag){flag==0?flag=1:flag=0;if(s.ar==m&&s.br==n){ //找到了一种方法 for(int i=0;i<v.size();i++) printf("(%d,%d,%d,%d)%s",v[i].al,v[i].bl,v[i].ar,v[i].br,i==v.size()-1?"\n":"->");//打印出一条路径 return;} for(int i=0;i<8;i++){if(Can(s,operatora[i],operatorb[i],flag)){state now;if(flag==1){   now.al=s.al-operatora[i];now.ar=s.ar+operatora[i];now.bl=s.bl-operatorb[i];now.br=s.br+operatorb[i];}else{now.ar=s.ar-operatora[i];now.al=s.al+operatora[i];now.br=s.br-operatorb[i];now.bl=s.bl+operatorb[i];} v.push_back(now);//存下下一个状态 DFS(now,flag); //遍历下一个状态 v.pop_back(); //pop掉该状态 }}}
int main(){cin>>m>>n;state s;s.al=m;s.bl=n;s.ar=0;s.br=0;v.push_back(s);DFS(s,0);
}

在这次编码中有出现了很多需要注意的点:

  • 判断该状态是否能做某操作时要考虑很多条件,比如说是否还大于0,传教士的数目是否大于等于狼人的数目等等
  • 刚开始代表向左向右的flag一直没起到作用,后来发现不应该在每一个DFS里都要变,而是要根据父节点的flag来变。

DFS实现传教士野人渡河问题相关推荐

  1. C语言版,传教士与野人渡河问题,使用深度优先搜索法求解(DFS),变态版,随便输入人数和船的最大载人数,人工智能经典题目,简单易懂,注释到位,没有bug

    目录 一.问题描述 二.迟来的代码 运行截图 三.简单分析 一.问题描述 有n个传教士和n个野人准备渡河,但只有一条能容纳c个人的小船,为了防止野人侵犯传教士,要求无论在何处,传教士的人数不得少于野人 ...

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

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

  3. AI A_star算法野人渡河-实验报告

    1. 问题描述及实验要求 请用A*算法实现野人过河问题,(1)分析设计估价函数f(2)采用C语言或Python编程实现(代码中适当加注释,输出具有可读性).        问题描述:设有m个传教士和n ...

  4. 过河问题(牛虎过河、商人仆人过河、农夫妖怪过河、传教士野人过河)(第2届第2题)

    ▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ 最新链接 题目要求 问题描述:三只牛三只虎过河,船最多只能容纳两只动物,且船在往返途中不能为空. ...

  5. 人工智能导论实验2——野人渡河黑白棋问题

    人工智能导论实验2--野人渡河&黑白棋问题 实验目的及要求: 本项目要求能够理解人工智能的基本原理,理解状态空间的概念.原理和方法,掌握用状态空间表示问题的步骤,掌握搜索方法的基本原理,并能够 ...

  6. 人工智能实验报告 牧师与野人渡河 知识表示方法

    牧师与野人渡河问题 编译环境 Dev C++ 5.6.1 windows 10 实验要求 实验代码 #include<cstdio> #include<queue> #incl ...

  7. AI传教士和野人渡河问题-实验报告

    一 题目要求: 设有m个传教士和n个野人来到河边,打算乘一只船从左岸渡到右岸去,该船每次最多载3人.在任何时候,如果野人人数超过传教士人数,那么野人就会把传教士吃掉.他们怎样才能用这条船安全地把所有人 ...

  8. 人工智能及其应用 实验课 源代码

    实验一 梵塔问题 #include<bits/stdc++.h> using namespace std; using ll = long long; ll ans = 0; void d ...

  9. JAVA野人_Java实现传教士与野人过河问题

    1  问题定义 河的两岸有三个传教士和三个野人需要过河,目前只有一条能装下两个人的船,在河的任何一方或者船上,如果野人的人数大于传教士的人数,那么传教士就会被野人攻击,怎么找出一种安全的渡河方案呢? ...

最新文章

  1. 信息安全系统设计基础第五周学习总结
  2. 通过反射获取DLL的类实现加载窗体
  3. BZOJ 4278: [ONTAK2015]Tasowanie 后缀数组 + 贪心 + 细节
  4. C 输入 输出——Day03
  5. 安卓开发笔记(十):升级ListView为RecylerView的使用
  6. 批量生产insert 或者update语句
  7. 特斯拉AI日的感知之旅
  8. 和秋叶一起学PPT之绘制表格(课时七)
  9. echarts 实现世界地图地域流向炫酷效果
  10. 虚化照片怎么弄?这几种方法很简单
  11. 智能生活管家项目之一-系统简介
  12. ROS2 Foxy depthai_ros教程
  13. 王峻涛 访谈录(二):向电子商务,出发。五年,一步
  14. 山东省第五届省赛题C Colorful Cupcakes(五维数组+记忆化搜索)
  15. 【FPGA学习记录1】异步FIFO的介绍
  16. vue移动端底部菜单tabbar
  17. 交换机VSU相关显示命令
  18. IEC101测试工具
  19. 想知道黑白照片怎么变彩色?这些软件你值得拥有
  20. ipv6服务器搭建网站,IPV6地址访问web项目网站配置

热门文章

  1. 根据userAgent获取浏览器/操作系统/设备类型等信息
  2. 2021-11-23----韩顺平Java入门第十四天
  3. 丘比特之箭——知乎多场景内容匹配项目:实现各种不同类型的文本之间的准确匹配 |百万人学AI评选
  4. matlab光子晶体求反射率,一维光子晶体禁带结构的MATLAB分析计算讲解.PDF
  5. 超美的天环星轨动态引导页html官网源码下载
  6. 关于麒麟!关于互联网
  7. 协方差矩阵、大数定律、牛顿迭代法
  8. XSS插入绕过一些方式总结
  9. 缺氧游戏 游戏泉修改_自己用的
  10. 一个C语言算法--税收计算