/**
*   2014-08-25 by Liy
*   修道士和野人过河问题,一共有3个修道士和3个野人,1条船
*   1、船最多可乘坐2人
*   2、两岸边 野人的数量不能多于修道士的数量,否则修道士会被吃掉
*
*   解法:A*算法, 构造估价函数
*
**/#include <cstdio>
#include <queue>
#include <cstring>using namespace std;bool Safe;
int M, C, K, B;
int st[100][100][2]; // 标记状态
int add[][2] = {1,1, 0,2, 2,0, 1,0, 0,1}; //操作规则struct Node {int pid; //父亲编号int id; // 编号,记录路径int m;  // 左边修道士数量int c;  // 左边野人数量int b;  // 左边船只数量Node() {}Node(int _m, int _c, int _b, int _id, int _pid = -1) {m = _m; c = _c; b = _b; id = _id; pid = _pid;}
};struct AstarNode {int f; // 估计值int g; // 当前已划船次数Node node;AstarNode() {}AstarNode(int _g, Node _node) {node = _node;g = _g;f = g + h();}bool operator < (const AstarNode& a) const {return f > a.f;}int h() { //启发函数,从当前状态到达最终状态需要的最少次数return node.m + node.c - K * node.b;}
};// 判断状态是否合法
bool OK(int m, int c, int b) {if(m > M || m < 0 || c > C || c < 0 || (m != 0 && m < c) || (M-m != 0 && (M-m) < (C-c))) return false;if(st[m][c][b] != -1) return false;return true;
}vector<Node> PathNode;
priority_queue<AstarNode> Q;void printPath(int id) {if(id != -1) {printPath(PathNode[id].pid);if(PathNode[id].pid == -1) printf("起始状态: ");else if(PathNode[id].m == 0 && PathNode[id].c == 0) printf("终止状态: ");else printf("    ----> ");printf("(%d, %d, %d)\n", PathNode[id].m, PathNode[id].c, PathNode[id].b);}
}void Astar() {while(!Q.empty()) Q.pop();PathNode.clear();memset(st, -1, sizeof(st));PathNode.push_back(Node(M, C, B, 0, -1));Q.push(AstarNode(0, PathNode[0]));st[M][C][B] = 0;int m, c, b, flag, id;while(!Q.empty()) {AstarNode as = Q.top(); Q.pop();//printf("----%d %d %d %d %d----\n", as.f, as.g, as.node.m, as.node.c, as.node.b);if(as.node.m == 0 && as.node.c == 0) {printf("渡河方案如下:\n");printf("          (M, C, B)\n");printPath(as.node.id);printf("可以安全渡河,来回最少需 %d 次便可!\n", as.g);Safe = true;return;}if(as.node.b == 1) flag = -1;else flag = 1;b = 1 - as.node.b;id = PathNode.size() - 1;for(int i = 0; i < 5; ++i) {m = as.node.m + flag * add[i][0];c = as.node.c + flag * add[i][1];if(OK(m, c, b)) {++id;st[m][c][b] = as.g + 1;PathNode.push_back(Node(m, c, b, id, as.node.id));Q.push(AstarNode(as.g + 1, PathNode[id]));}}}
}int main(int argc, char *argv[]) {for(int i = 3; i < 6; ++i){M = C = i; B = 1; K = 2;printf("M(修道士) = %d 人, C(野人) = %d 人, K(限乘) = %d 人, B(船) = %d条.\n", M, C, K, B);Safe = false; Astar();if(!Safe) {printf("没有方案可以安全渡河!!!\n");}putchar(10);}return 0;
}

// 这里只打印出了一种方案,也可以打印出所有的最优可行方案, 这里船只能有 1 条,且只能坐 2 个人,没有考虑其它的情况, 修道士和野人的人数可以改变

修道士和野人过河问题 A*算法 人工智能相关推荐

  1. 人工智能实践作业-修道士和野人过河问题

    人工智能实践作业-修道士和野人过河问题: 用编程语言编写和调试一个基于深度优先搜索法的解决"野人与传教士过河"问题的程序.目的是学会运用知识表示方法和搜索策略求解一些考验智力的简单 ...

  2. 1. A星算法解决修道士与野人问题

    A星算法解决修道士与野人问题 1. 运行环境 CPU:I5-10400 内存:16GB 系统:Win10 64位专业版,20H2 IDE:Vistual Studio 2019专业版 2. 问题描述 ...

  3. 修道士与野人问题——C++源代码,伪代码,详细分析

    前言:这一个经典的问题,可以把问题转换成数据结构中的 图 来解决.本博客节选自我去年7月份的数据结构报告 问题描述 假设有 n 个修道士和 n 个野人准备渡河,但只有一条能容纳 c 人的小船,为了防止 ...

  4. 修道士和野人java_修道士和野人问题

    休闲时刻看看神经网络方面的书,发现了修道士和野人的问题,不禁勾引起我写算法的欲望,曾经的三只大老虎三只小老虎过河问题.人狼羊白菜过河问题.汉诺塔.哈夫曼等等各种算法瞬间在脑海中约隐约现,修道士和野人问 ...

  5. 修道士和野人java_野人与修道士问题——详细分析与C++源代码

    前言:这一个经典的问题,可以把问题转换成数据结构中的 图 来解决.本博客节选自我去年7月份的数据结构报告 问题描述 假设有 n 个修道士和 n 个野人准备渡河,但只有一条能容纳 c 人的小船,为了防止 ...

  6. 修道士和野人问题:所有解、启发求解、简单界面

    一.作业任务 修道士和野人问题:设有三个修道士和3个野人来到河边,打算用一条船从河的左岸渡到河的右岸去.但该船每次只能装载两个人,在任何岸边野人的数目都不得超过修道士的人数,否则修道士就会被野人吃掉. ...

  7. 2.修道士和野人问题

    2.修道士和野人问题:设有三个修道士和3个野人来到河边,打算用一条船从河的左岸渡到河的右岸去.但该船每次只能装载两个人,在任何岸边野人的数目都不得超过修道士的人数,否则修道士就会被野人吃掉.假设野人服 ...

  8. 使用dfs求解修道士和野人问题

    原文链接: 使用dfs求解修道士和野人问题 上一篇: js Set 的使用 下一篇: VMware 挂载U盘 1.问题描述 :这是一个古典问题.假设有n个道士和n个野人准备渡河.但只有一条能容纳c人的 ...

  9. 用状态空间方法求解修道士与野人问题

    目录 一.状态空间表示法回顾 1.问题状态空间的构成 2.用状态空间表示问题的步骤 二.使用状态空间法求解修道士与野人问题 1.问题描述 2.状态空间求解步骤 总结 一.状态空间表示法回顾 状态空间表 ...

最新文章

  1. Java 抖音授权登录
  2. 文件服务器的配置与管理(2) 实现软RAID
  3. mysql性能测试工具msyqlslap_mysqlslap工具测试mysql DB的性能
  4. 2019-03-09-算法-进化(从排序数组中删除重复项)
  5. 【操作系统】上下文切换
  6. windows环境 安装python的虚拟环境,安装第三方包的总结
  7. MATLAB2016下载地址,包含安装教程
  8. PyTorch 入坑十一: 损失函数、正则化----深刻剖析softmax+CrossEntropyLoss
  9. 161212 笔记--无线传感网络中的MAC协议
  10. 财会法规与职业道德【18】
  11. blob和clob类型数据怎么插入数据库
  12. STM32项目分享---MQTT智能门禁系统(含APP控制)
  13. java游戏 飞机对战
  14. 菜鸟官网下载爱装apache
  15. java xml sql_走进 SQL/XML
  16. 飞控之扩展卡尔曼滤波(附matlab和C代码)
  17. word中装订线位置_word装订线位置在哪里
  18. CTF中Crypty(密码类)入门必看
  19. 餐饮数据的分析与挖掘(1)——数据采集
  20. oracle 的 rank()函数

热门文章

  1. 哈工大 计算机系统 大作业 2021春
  2. 嵌入式学习笔记(1)-Ubuntu基本操作及软件安装
  3. 封闭式基金高折价蕴涵巨大投资机会
  4. Windows、Linux、Apple三大操作系统的主流文件系统包含哪些?
  5. [奔跑吧 Linux内核][学习记录]编译内核-实验1-2-[环境以及参考]
  6. (4)Angular的开发
  7. 计算机word插图教案,中学信息技术《配插图》教案
  8. 中国医疗保健分析测试服务行业市场供需与战略研究报告
  9. html5中加入音乐怎么弄,如何在H5页面上添加音乐播放
  10. 【Bash百宝箱】Android envsetup.sh及lunch