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三方 ...
随机推荐
- AT-PagerAdapter
关于PagerAdapter的粗略翻译 英文版api地址:PagerAdapter(自备梯子) PagerAdapter 已知直接子类:FragmentPagerAdapter.Fra ...
- hello world of hibernate Annotation
1:建立所需要的类,如: package com.hibernate.model; import javax.persistence.Entity; import javax.persistence. ...
- [转]Install Windows Server 2012 in VMware Workstation
本文转自:http://kb4you.wordpress.com/2012/06/28/install-windows-server-2012-in-vmware-workstation-2/ Thi ...
- 使用C#动态生成Word文档/Excel文档的程序测试通过后,部署到IIS服务器上,不能正常使用的问题解决方案
使用C#动态生成Word文档/Excel文档的程序功能调试.测试通过后,部署到服务器上,不能正常使用的问题解决方案: 原因: 可能asp.net程序或iis访问excel组件时权限不够(Ps:Syst ...
- jQuery中的经典动画
show()方法和hide()方法是jQuery中的基本动画方法,hide()方法等于将css()方法设置display属性为none.如何让元素动起来呢,我们可以在show和hide里加入slow, ...
- 安装程序无法初始化。请下载Adobe Support Advisor检测该问题
adobe FLASH BUILDER 4.6在安装时出现各种各样的问题,虽然绿化版安装方便,但是平均5分钟一崩溃实在让人头大.安装时出现“安装程序无法初始化.请下载Adobe Support Adv ...
- C#winform MDI子窗体打开时内容显示不全
出现这种情况一般是 打开了多个MDI的子窗体,打开新窗体的时候关闭其他的子窗体就OK了, 具体代码: foreach (Form form in main.MdiChildren) ...
- PHP学习笔记 - 进阶篇(10)
PHP学习笔记 - 进阶篇(10) 异常处理 抛出一个异常 从PHP5开始,PHP支持异常处理,异常处理是面向对象一个重要特性,PHP代码中的异常通过throw抛出,异常抛出之后,后面的代码将不会再被 ...
- JS 截取字符串函数
一.函数:split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组 例子: str=”jpg|bmp|gif|ico|png”; arr=theString.split(”|”); //a ...
- java filter的一些理解
java filter即 java中的过滤器: 一. * web项目中只有三个组件 * 过滤器filter ↓ 级 别 * 监听器 ↓ 级 别 * servlet ...