题目描述:农夫需要把狼、羊、菜和自己运到河对岸去,只有农夫能够划船,而且船比较小,除农夫之外每次只能运一种东西,还有一个棘手问题,就是如果没有农夫看着,羊会偷吃菜,狼会吃羊。请考虑一种方法,让农夫能够安全地安排这些东西和他自己过河。

想这个问题一连想了好几天,本人没有系统的学过算法,有些概念也不是很清楚,只因解决问题为目标。

尝试过图论解决,但用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语言-人狼羊菜问题-最容易看懂的解决方法及代码的更多相关文章

  1. 《Selenium 2自动化测试实战 基于Python语言》中发送最新邮件无内容问题的解决方法

    虫师的<Selenium 2自动化测试实战 基于Python语言>是我自动化测试的启蒙书 也是我推荐的自动化测试入门必备书,但是书中有一处明显的错误,会误导很多读者,这处错误就是第8章自动 ...

  2. C语言报错:“gets”: 找不到标识符。解决方法

    C语言报错:“gets”: 找不到标识符. 把“gets”改成“gets_s”即可.

  3. C语言中关于POW在不同状态下四舍五入的解决方法

    这是今天作业中的一个代码: #include <stdio.h>#include<math.h>int main(){ printf("请输入一个整数:") ...

  4. 关于c语言的位运算&,|,^(看懂汉字的都能看懂)

    其中|,&可以当作逻辑运算符,当|,&当成逻辑运算符时,与||,&&的用法基本相似,&&,||运算时会当前面的表达式能够决定整个表达式,则不进行对后面的 ...

  5. Objective-C语言介绍 、 Objc与C语言 、 面向对象编程 、 类和对象 、 属性和方法 、 属性和实例变量

    1 第一个OC控制台程序 1.1 问题 Xcode是苹果公司向开发人员提供的集成开发环境(非开源),用于开发Mac OS X,iOS的应用程序.其运行于苹果公司的Mac操作系统下. 本案例要求使用集成 ...

  6. ueditor的工具栏显示乱码解决方法 小问题.. 是你的页面编码与语言包js编码不符所导致的

    ueditor的工具栏显示乱码解决方法 小问题..  是你的页面编码与语言包js编码不符所导致的解决方法:用记事本将ueditor\..\lang\zh-cn\zh-cn.js打开,然后保存为ANSI ...

  7. Oracle存储过程中不支持DML语言的解决方法(针对遇见的DROP关键字)

    ---存储过程中的原语句: ---删除表 DROP TABLE A_NEWTDDATA; --报错 经查询:存储过程不支持DML语言: 解决方法: execute immediate 'DROP TA ...

  8. R语言实现︱局部敏感哈希算法(LSH)解决文本机械相似性的问题(二,textreuse介绍)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 上一篇(R语言实现︱局部敏感哈希算法(LSH) ...

  9. 关于swift语言中导入OC三方类找不到头文件的解决方法

    首先我遇到的问题是这样的: 我之前封装的OC类,我导入现在的swift工程中,然后建立桥接文件,在Swift的控制器中可以找到这个OC写的东西. 但是问题来了,当你使用cocoapods导入的OC三方 ...

随机推荐

  1. this的分析

    this是js中的一个关键字,当函数运行时,会自动生成的一个对象,只能在函数内部使用.随着函使用场合不同,this值会变化,但是始终指向调用函数的那个对象. 1.纯粹的函数调用 function bo ...

  2. 为Mono安装MySql连接驱动

    为Mono安装MySql连接驱动(转) 2013 年 1 月 24 日.NETmono.MySql DOTNET and Mono by default only support database c ...

  3. request 和response 中的setCharacterEncoding区别

    response和request的setCharacterEncoding 一.request.setCharacterEncoding():是设置从request中取得的值或从数据库中取出的值. 指 ...

  4. iOS之上线被拒

    前言 感谢您付出宝贵的才华与时间来开发iOS应用程程序.从职业与报酬的角度而言,这对于成千上万的开发员来说一直都是一项值得投入的事业,我们希望帮助您加入这个成功的组织.我们发布了<App Sto ...

  5. php实现MVC

    在PHP中使用MVC越来越流行了,特别是在一些开源的框架当中.MVC足以应对大多数的情况,但还有一些情况是其不太适合的,如比较简单的个人博客,对于只有几百篇文章量级的博客,使用MVC让人觉得有些太复杂 ...

  6. python 基础——*args和**kwargs

    *args表示任何多个无名参数,它是一个tuple:**kwargs表示关键字参数,它是一个dict. def func(one, *args, **kwargs): print type(one) ...

  7. 锋利的jQuery第2版学习笔记1~3章

    第1章,认识jQuery 注意:使用的jQuery版本为1.7.1 目前流行的JavaScript库 Prototype(http://www.prototypejs.org),成型早,面向对象的思想 ...

  8. HttpClient(4.3.5) - HTTP Request & HTTP Response

    HTTP Request All HTTP requests have a request line consisting a method name, a request URI and an HT ...

  9. Redis 命令 - Strings

    APPEND key value Available since 2.0.0, Time complexity: O(1). Append a value to a key 127.0.0.1:637 ...

  10. AppScan安全问题解决方案

    一. 环境准备 测试通常给的是PDF文档,动辄几百页,看起来很费劲,看文档的时间可能比解决问题的时间还长...所以作为需要解决问题的我们来说,最好安装AppScan,请测试人员提供类型为AppScan ...