3个传教士和3个野人(别人写的很好的算法,值得一读)
来源:互联网 发布:warframe淘宝买白金 编辑:程序博客网 时间:2024/06/05 06:21
问题描述:设有3个传教士(Missionaries)和3个野人(Cannibals)来到河边,打算乘一只船从右岸渡到左岸去。该船的最大负荷能力为两个人(k=2)。在任何情况下:如果野人人数超过传教士人数,那么野人就会把传教士吃掉。他们怎样才能用这条船安全地把所有人都渡过河去呢?(提示:用状态空间来描述,其综合数据库:用三元数组表示, m表示传教士,c表示野人,b表示船状态)
#include <iostream> #include <vector> #include <list> using namespace std; typedef struct { int m;//表示传教士 int c;// 表示野人 int b;//船状态 }MCNode; list<MCNode> fringe;//相当于队列 vector<MCNode> closed;//closed表 //判断是否是目标结点 bool IsGoal(MCNode tNode) { if(tNode.m==0&&tNode.c==0&&tNode.b==0) return true; else return false; } //判断是否是合法状态 bool IsLegal(MCNode tNode) { if(tNode.m>=0&&tNode.m<=3&&tNode.c>=0&&tNode.c<=3) { if((tNode.m==tNode.c)||(tNode.m==3)||(tNode.m==0)) return true; else return false; } else return false; } //重载运算符,判断两结构体是否相等 bool operator==(MCNode m1,MCNode m2) { if(m1.m==m2.m&&m1.c==m2.c&&m1.b==m2.b) return true; else return false; } //判断是否已在closed表中 bool IsClosed(MCNode tNode) { int i; for(i=0;i!=closed.size();i++) { if(tNode==closed[i]) return true; } if(i==closed.size()) return false; } void ExpandNode(MCNode tNode,int b,list<MCNode> &fringe) { MCNode node[5];//应用5条规则集生成新结点 if(b==1) { for(int i=0;i<5;i++) node[i].b=0; node[0].m=tNode.m-1; node[0].c=tNode.c; node[1].m=tNode.m; node[1].c=tNode.c-1; node[2].m=tNode.m-1; node[2].c=tNode.c-1; node[3].m=tNode.m-2; node[3].c=tNode.c; node[4].m=tNode.m; node[4].c=tNode.c-2; } else { for(int i=0;i<5;i++) node[i].b=1; node[0].m=tNode.m+1; node[0].c=tNode.c; node[1].m=tNode.m; node[1].c=tNode.c+1; node[2].m=tNode.m+1; node[2].c=tNode.c+1; node[3].m=tNode.m+2; node[3].c=tNode.c; node[4].m=tNode.m; node[4].c=tNode.c+2; } for(int i=0;i<5;i++) if(IsLegal(node[i])&&!IsClosed(node[i])) fringe.push_front(node[i]);//队列后进先出,深度优先搜索,最后得到一条最小解序列 // fringe.push_back(node[i]);//队列后进后出,广度优先搜索,最后得到最小解序列状态空间图 } void main() { MCNode InitNode,unode; InitNode.m=3; InitNode.c=3; InitNode.b=1; fringe.push_back(InitNode);//将初始状态空间加入到队列 while(!fringe.empty()) { unode=fringe.front(); fringe.pop_front(); if(IsGoal(unode)) { closed.push_back(unode); for(int i=0;i!=closed.size();i++) cout<<closed[i].m<<","<<closed[i].c<<","<<closed[i].b<<endl; break; } if(!IsClosed(unode)) { closed.push_back(unode); ExpandNode(unode,unode.b,fringe); } } } /*渡法说明: 2个野人去,1个野人回 2个野人去,1个野人回 2个传教士去,1个野人与1个传教士回 2个传教士去,1个野人回 2个野人去,1个野人回 2个野人去,完成 */
- 3个传教士和3个野人(别人写的很好的算法,值得一读)
- 【算法】传教士和野人问题
- 3个传教士与3个野人,哥带你们过河去
- 野人和传教士过河问题的C语言源代码
- 野人和传教士渡河问题的java实现
- 野人传教士过河 算法
- 传教士与野人过河问题(一)
- 关于野人与传教士问题的心得
- A*算法————传教士和野人
- 传教士和野人过河问题
- 【人工智能】传教士和野人问题(M-C问题)
- 值得思考的3个问题
- 人工智能作业 三个野人和三个传教士
- 传教士和野人问题(Missionaries and Cannibals)
- 三个传教士和三个野人过河
- 传教士和野人问题解题思路
- 值得一读的20个经典故事
- 25个值得一读的人文博客
- java 操作properties
- 树——《数据结构与算法分析C++描述》
- 作品展引发.....
- 挑战代码淘宝UED前端智勇大冲关第二季
- Linux进程管理
- 3个传教士和3个野人(别人写的很好的算法,值得一读)
- jQuery之Tab切换代码改进
- Request Encoding ,Page Encoding,Response Encoding 以及中文乱码的原因
- leetcode Subsets II
- .Net中常用的加密解密介绍
- 安装下载node.js通过msnodesql访问SQL Server
- Gibonacci number
- 复选框功能
- Android - Binder机制 - 普通service注册