C语言-人狼羊菜问题-最容易看懂的解决方法及代码
题目描述:农夫需要把狼、羊、菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊。请考虑一种方法,让农夫能够安全地安排这些东西和他自己过河。
想这个问题一连想了好几天,本人没有系统的学过算法,有些概念也不是很清楚,只因解决问题为目标。
尝试过图论解决,但用floyed算法只能算出最短路径值,如何输出过程,一直没想出好的解决方法。
然后看了下面这篇文章,尝试抛弃图论,用树的思想来解决这个问题。建议阅读下面代码时,先看看这篇文章。
参考资料:http://blog.csdn.net/orbit/article/details/7563220
在写代码时,本人采用了上述文章中的思想,又借鉴了图论中存储结点的一些方法。
我觉得这样写应该非常容易看懂了。具体思路见代码。
#include <stdio.h>
#define INF 9999
//8个动作
char *action[]={"农夫单独过河","农夫带狼过河","农夫带羊过河","农夫带菜过河",
"农夫单独返回","农夫带狼返回","农夫带羊返回","农夫带菜返回"};
//10种状态
char *state[]={"人狼羊菜","人狼羊","人狼菜","人羊菜","人羊","狼菜","狼","羊","菜","空"}; //状态转换规则:GA[i][j]=k 表示【状态i】可以通过【动作k】转换到【状态j】,GA[i][j]=INF表示不可直接转换
int GA[][]={INF,INF,INF,INF,INF, ,INF,INF,INF,INF,
INF,INF,INF,INF,INF,INF, , ,INF,INF,
INF,INF,INF,INF,INF, , ,INF, ,INF,
INF,INF,INF,INF,INF,INF,INF, , ,INF,
INF,INF,INF,INF,INF,INF,INF, ,INF, ,
,INF, ,INF,INF,INF,INF,INF,INF,INF,
INF, , ,INF,INF,INF,INF,INF,INF,INF,
INF, ,INF, , ,INF,INF,INF,INF,INF,
INF,INF, , ,INF,INF,INF,INF,INF,INF,
INF,INF,INF,INF, ,INF,INF,INF,INF,INF}; //记录每一步的动作
int record_action[];
//记录每一步动作后的状态
int record_state[]; //搜索从第step步开始、第i个结点到第n个结点的过程(step从0算起)
void search(int i,int n,int step)
{
int k;//动作
int j;//可能要转换到的状态
if(i==n)
{
for(k=;k<step;k++)
printf("step %d: %s,左岸还剩 %s\n",k+,action[record_action[k]],state[record_state[k]]);
printf("step count:%d\n\n",step);
return;
}
//查找在当前【状态i】下能转换到的【其它状态j】,并且【状态j】不能在之前出现过
//查找时可能会出现多个 j,所以这是一个多叉树
for(k=;k<;k++)
{
for(j=;j<;j++)
if(GA[i][j]!=INF&&GA[i][j]==k)//判断状态i能否通过动作k转换到状态j
{
int m;
//下面这个循环是判断状态j在之前是否出现过
for(m=;m<step;m++)
if(j==record_state[m])break;
if(m<step)continue;
//如果j满足前面所有条件,则记录这一步
record_action[step]=k; //第step步所使用的动作
record_state[step]=j; //第step步所转换的状态
search(j,n,step+); //继续搜索下一步
}
} }
int main()
{
search(,,);
return ;
}
C语言-人狼羊菜问题-最容易看懂的解决方法及代码的更多相关文章
- 《Selenium 2自动化测试实战 基于Python语言》中发送最新邮件无内容问题的解决方法
虫师的<Selenium 2自动化测试实战 基于Python语言>是我自动化测试的启蒙书 也是我推荐的自动化测试入门必备书,但是书中有一处明显的错误,会误导很多读者,这处错误就是第8章自动 ...
- C语言报错:“gets”: 找不到标识符。解决方法
C语言报错:“gets”: 找不到标识符. 把“gets”改成“gets_s”即可.
- C语言中关于POW在不同状态下四舍五入的解决方法
这是今天作业中的一个代码: #include <stdio.h>#include<math.h>int main(){ printf("请输入一个整数:") ...
- 关于c语言的位运算&,|,^(看懂汉字的都能看懂)
其中|,&可以当作逻辑运算符,当|,&当成逻辑运算符时,与||,&&的用法基本相似,&&,||运算时会当前面的表达式能够决定整个表达式,则不进行对后面的 ...
- Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量
1 第一个OC控制台程序 1.1 问题 Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序.其运行于苹果公司的Mac操作系统下. 本案例要求使用集成 ...
- ueditor的工具栏显示乱码解决方法 小问题.. 是你的页面编码与语言包js编码不符所导致的
ueditor的工具栏显示乱码解决方法 小问题.. 是你的页面编码与语言包js编码不符所导致的解决方法:用记事本将ueditor\..\lang\zh-cn\zh-cn.js打开,然后保存为ANSI ...
- Oracle存储过程中不支持DML语言的解决方法(针对遇见的DROP关键字)
---存储过程中的原语句: ---删除表 DROP TABLE A_NEWTDDATA; --报错 经查询:存储过程不支持DML语言: 解决方法: execute immediate 'DROP TA ...
- R语言实现︱局部敏感哈希算法(LSH)解决文本机械相似性的问题(二,textreuse介绍)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 上一篇(R语言实现︱局部敏感哈希算法(LSH) ...
- 关于swift语言中导入OC三方类找不到头文件的解决方法
首先我遇到的问题是这样的: 我之前封装的OC类,我导入现在的swift工程中,然后建立桥接文件,在Swift的控制器中可以找到这个OC写的东西. 但是问题来了,当你使用cocoapods导入的OC三方 ...
随机推荐
- css笔记16:盒子模型的入门案例
1.案例一: 效果图如下: (1)box1.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&quo ...
- linux高可用集群(HA)原理详解(转载)
一.什么是高可用集群 高可用集群就是当某一个节点或服务器发生故障时,另一个 节点能够自动且立即向外提供服务,即将有故障节点上的资源转移到另一个节点上去,这样另一个节点有了资源既可以向外提供服务.高可用 ...
- javaweb学习总结十五(web开发的相关概念以及常用服务器介绍)
一:java web开发的相关概念 1:web分为静态web和动态web 2:模拟web服务器 web页面如果想让外部网络访问,必须通过网络程序读取资源,流程: a:用户通过浏览器访问网络程序 b:网 ...
- CentOS7.0 重置Root的密码
首先进入开启菜单,按下e键进入编辑现有的内核,如下图所示 然后滚动列表,找到ro,将它替换成rw,并加上init=/sysroot/bin/sh,最终变为如下图 然后按CTRL+X进入到单用户模式,在 ...
- 最简单的Linux-ACL操作
添加ACL setfacl -m u:'username':rw 'dir or file' "-R可以迭代式的给目录下所有文件都添加相同的ACL" 查看ACL规则 getfa ...
- [改善Java代码]使用匿名类的构造函数
建议39: 使用匿名类的构造函数 阅读如下代码,看看是否可以编译: public class Client { public static void main(String[] args) { Lis ...
- Wince 对话框程序设计
如何编程实现wince下“打开文件夹对话框”呢?这里就要涉及到下面要分析的知识了,对话框是一种特殊的窗口,它在wince 作为应用程序和程序使用者之间的交流窗口,通过显示和获取信息使人们的交流更加方便 ...
- hdu 3622 二分+2-SAT判定
思路:如题 #include<iostream> #include<algorithm> #include<cstring> #include<cstdio& ...
- mysql 慢执行分析工具explain/desc
一.如何操作 explain + 增删改查语句; 二. 输出格式 possible_keys mysql在搜索表记录时可能使用哪个索引. key 实际使用的索引,如果没有索引被使用,则为null. ...
- 媒体查询的应用以及在css3中的变革
CSS一直都支持设置与媒体相关联的样式表.它们可以适应不同媒体类型的显示.例如,文档在屏幕显示时使用sans-serif字体,在打印时则使用serif字体.screen和print是两种预定义的媒体类 ...