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三方 ...
随机推荐
- div容器内文本对齐--神奇的css
有时候使用一些css往往能达到意想不到的效果 最近需要在页面上显示读取的文本内容,中英文混杂着,我把它们统统抛到div中div设置了宽度,效果是相当糟糕,左对齐,右端长短不一,有的超出长度,有的不够长 ...
- LeetCode 292
Nim Game You are playing the following Nim Game with your friend: There is a heap of stones on the t ...
- 【线性结构上的动态规划】UVa 11584 - Partitioning by Palindromes
回文串问题.给出一个字符串,问最少可以划分为多少个字符串子串. 对于判断是否为回文串,对于不是很长的字符串,可以采取直接暴力,即从两边向中间收缩判断字符相等. bool is_pali(int l, ...
- poj 1987 树的分治
思路:1741的A1送 1. #include<iostream> #include<cstring> #include<algorithm> #include&l ...
- 屏蔽cBox广告的方法 无需安装软件
在hosts文件中加入两句代码: 127.0.0.1 games.cntv.cn 127.0.0.1 d.cntv.cn
- poj2243
Knight Moves Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13433 Accepted: 7518 Des ...
- asp.net微信支付打通发货通知代码
上次遇到微信支付,发货接口的时候,官方的demo也没有提供相应的代码 ,因本人技术有限,百度 google 很久都没有asp.net 版本的,最后只好硬着头皮自己搞,没想到官方文档也是错的. 我这一步 ...
- Java Concurrency - 线程执行器
Usually, when you develop a simple, concurrent-programming application in Java, you create some Runn ...
- CXF(2.7.10) - Writing a service with Spring
1. 定义服务接口. package com.huey.demo.ws; import javax.jws.WebParam; import javax.jws.WebService; @WebSer ...
- CXF(2.7.10) - RESTful Services, JSON Support
在 CXF(2.7.10) - RESTful Services 介绍了 REST 风格的 WebService 服务,数据传输是基于 XML 格式的.如果要基于 JSON 格式传输数据,仅需要将注解 ...