车羊问题c语言编程,C语言-人狼羊菜问题-最容易看懂的解决方法及代码

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

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

尝试过图论解决,但用floyed算法只能算出最短路径值,如何输出过程,一直没想出好的解决方法。

然后看了下面这篇文章,尝试抛弃图论,用树的思想来解决这个问题。建议阅读下面代码时,先看看这篇文章。

参考资料:http://blog.csdn.net/orbit/article/details/7563220

在写代码时,本人采用了上述文章中的思想,又借鉴了图论中存储结点的一些方法。

我觉得这样写应该非常容易看懂了。具体思路见代码。

1 #include

2 #define INF 9999

3 //8个动作

4 char *action[8]={"农夫单独过河","农夫带狼过河","农夫带羊过河","农夫带菜过河",

5 "农夫单独返回","农夫带狼返回","农夫带羊返回","农夫带菜返回"};

6 //10种状态

7 char *state[10]={"人狼羊菜","人狼羊","人狼菜","人羊菜","人羊","狼菜","狼","羊","菜","空"};

8

9 //状态转换规则:GA[i][j]=k 表示【状态i】可以通过【动作k】转换到【状态j】,GA[i][j]=INF表示不可直接转换

10 int GA[10][10]={INF,INF,INF,INF,INF, 2,INF,INF,INF,INF,

11 INF,INF,INF,INF,INF,INF, 2, 1,INF,INF,

12 INF,INF,INF,INF,INF, 0, 3,INF, 1,INF,

13 INF,INF,INF,INF,INF,INF,INF, 3, 2,INF,

14 INF,INF,INF,INF,INF,INF,INF, 0,INF, 2,

15 6,INF, 4,INF,INF,INF,INF,INF,INF,INF,

16 INF, 6, 7,INF,INF,INF,INF,INF,INF,INF,

17 INF, 5,INF, 7, 4,INF,INF,INF,INF,INF,

18 INF,INF, 5, 6,INF,INF,INF,INF,INF,INF,

19 INF,INF,INF,INF, 6,INF,INF,INF,INF,INF};

20

21 //记录每一步的动作

22 int record_action[20];

23 //记录每一步动作后的状态

24 int record_state[20];

25

26 //搜索从第step步开始、第i个结点到第n个结点的过程(step从0算起)

27 void search(int i,int n,int step)

28 {

29 int k;//动作

30 int j;//可能要转换到的状态

31 if(i==n)

32 {

33 for(k=0;k

34 printf("step %d: %s,左岸还剩 %s\n",k+1,action[record_action[k]],state[record_state[k]]);

35 printf("step count:%d\n\n",step);

36 return;

37 }

38 //查找在当前【状态i】下能转换到的【其它状态j】,并且【状态j】不能在之前出现过

39 //查找时可能会出现多个 j,所以这是一个多叉树

40 for(k=0;k<8;k++)

41 {

42 for(j=0;j<10;j++)

43 if(GA[i][j]!=INF&&GA[i][j]==k)//判断状态i能否通过动作k转换到状态j

44 {

45 int m;

46 //下面这个循环是判断状态j在之前是否出现过

47 for(m=0;m

48 if(j==record_state[m])break;

49 if(m

50 //如果j满足前面所有条件,则记录这一步

51 record_action[step]=k; //第step步所使用的动作

52 record_state[step]=j; //第step步所转换的状态

53 search(j,n,step+1); //继续搜索下一步

54 }

55 }

56

57 }

58 int main()

59 {

60 search(0,9,0);

61 return 0;

62 }

来源:https://www.cnblogs.com/zandbin/p/5341656.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言简短的泡沫排序法编程,冒泡排序--简单(c语言)

//// main.cpp// bubble//// Created by duanqibo on 2019/7/17.// Copyright © 2019年 duanqibo. All rights reserved.// 冒泡排序 c语言#include #include #include #include #define N 4typedef struct student{int num;char name[20];char sex[2];int age;}stu[…

c语言求a1到an的和,C语言菜鸟基础教程之a++与++a

(一)a在C语言或其它语言中&#xff0c;符号表示“自加”&#xff0c;就是变量在原来的基础上加1。例1&#xff1a;a 0;a;则此时a的值为1。同样的道理&#xff0c;--表示”自减”。例2&#xff1a;a 100;a--;则此时a的值为99。注意&#xff0c;程序语言里没有”自乘”和”自除…

c语言 u16 printf,C 语言printf打印各种数据类型的方法(u8/s8/u16/s16.../u64/double/float)(全)...

u16首先必须知道u8,s8等数据类型的定义&#xff1a;typedef signed char s8;typedef unsigned char u8;typedef signed short s16;typedef unsigned short u16;typedef signed int s32;typedef unsigned int u32;typedef signed long long s64;typedef unsigned long long u64;…

算法与数据结构c语言版PPT,C语言算法与数据结构.ppt

C语言算法与数据结构.ppt第十二章 算法与数据结构12.1 算法的基本概念,该节知识点所占试题比重为12&#xff0c;属于重点考查对象&#xff0c;基本上每次必考&#xff0c;主要考查算法的定义和对算法复杂度的理解。历次试题分值在04分之间波动。,12.1.1 考点1 算法的定义,算法是…

android 应用自动重启,Android 应用崩溃后自动重启的方法

public class HKApplication extends Application {private List activityList new ArrayList();Overridepublic void onCreate() {super.onCreate();// 以下用来捕获程序崩溃异常if (!Config.debug) {Thread.setDefaultUncaughtExceptionHandler(restartHandler); // 程序崩溃…

android+自定义版本号,Android打包版本号设置方法

之前没有设置过打包的命名&#xff0c;每次打包都是默认的"app-realease.apk"&#xff0c;之后手动修改名字来显示出它是一个新版本。晚上学习了如何配置打包名称&#xff0c;很简单&#xff0c;修改build.gradle里的代码就行。详细记录如下&#xff1a;1、打开app这…

android工程师饱和,Android开发是否饱和了?你所不了解的Android开发

原标题&#xff1a;Android开发是否饱和了&#xff1f;你所不了解的Android开发Android开发是否饱和了?是很多人关心的问题&#xff0c;对于想要从事Android开发的人更是头等大事。如今&#xff0c;就业难成横亘在求职者面前的难题&#xff0c;而与 之相反是互联网行业的高薪多…

android的读取xml配置文件,android中XMl文件的读取

废话不多说了直接上代码&#xff1a;新建一个Xml文件用于读取&#xff1a;test.xmljavaEclipseSwiftXcodeC#Visual Studio后台&#xff1a;import android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.util.Log;import android.widget.TextView…

android 获取wifi的加密类型,wifi加密类型

最近开发wifi方面的功能&#xff0c;需要根据wifi加密类型来展现UI。遇到了一个比较蛋疼的问题&#xff1a;如何判断wifi加密类型wifi的管理需要通过WifiManager来操作WifiManager mWifiManager (WifiManager) context.getSystemService(Context.WIFI_SERVICE);开启和关闭wifi…

android编译的tool版本有多少,macOS Mojave(10.14.2)系统上编译LunarG/VulkanTools工程的Android版本...

$ cd ~$ git clone https://github.com/LunarG/VulkanTools.git$ cd VulkanTools$ cd build-android$ export ANDROID_SDK_HOME~/Library/Android/sdk$ export ANDROID_NDK_HOME~/Library/Android/sdk/ndk-bundle# 当前的版本需要Android SDK 23.0.0,但是需要Java 11以下版本的…

android底部导航栏软件,三步搞定android应用底部导航栏

很多android应用底部都有一个底部导航栏&#xff0c;方便用户在使用过程中随意切换。目前常用的做法有三种&#xff1a;一种是使用自定义tabHost&#xff0c;一种是使用activityGroup,一种是结合FrameLayout实现。笔者再做了多款应用后&#xff0c;为了节约开发周期&#xff0c…

html列表滑动字母索引,js实现做通讯录的索引滑动显示效果和滑动显示锚点效果...

只做实现。。完全没考虑性能优化。所以我实现了以后特别卡。第一个是在通讯录右边的索引条上进行滑动&#xff0c;滑动到相应字母就跳转到相应字母的锚点上。思路&#xff1a;监听touchmove事件&#xff0c;获取clientX和clientY&#xff0c;传入到elementFromPoint&#xff0c…

html一行中怎么写空格,html – 用一行填写空格

如何创建一个下划线,填充文本行末尾和DIV宽度结束之间的空白区域.我正在尝试以下方法&#xff1a;我希望当屏幕变小时,产品线会中断.我希望价格保持在右边,并加下划线.最后一个单词(Mayo)和价格之间的空格必须自动填充下划线.大屏幕&#xff1a;老奶酪 – 沙拉,牛油果,鸡蛋,草药…

android 屏幕飘动,Android自定义View实现飘动的叶子效果(三)

上一篇对自定义View及一些方法有所了解&#xff0c;下面做一个简单的叶子飘动的例子主要技术点1、添加背景图片canvas.drawBitmap()2、Matrix动画类3、Matrix添加到画布上步骤1、添加黄色背景颜色public LeafView(Context context, AttributeSet attrs) {super(context, attrs)…

html加入购物车的动画,vue实现加入购物车动画

预备基础整体思路定义商品列表&#xff0c;设置点击的元素(点击后触发加入购物车的函数addToShopCart)注&#xff1a;这里要把$event传递过去&#xff0c;方便得到target定义一个component用来放购物车和运动的小球定义一个component用来放运动的小球&#xff0c;里面包含多个b…

html 美化input file,Input[type=”file”] 显示效果美化方法 | 智慧宫

Html中input可以作为上传图片代码如下但是演示非常不好看&#xff0c;下面做一番美化处理&#xff0c;效果如下&#xff1a;文件上传美化前后对比美化方法隐藏 input 标签使用 label 标签在input标签位置显示&#xff1b;用js获取 input 中上传的文件名称&#xff0c;并在 labl…

html 进入效果,用css3实现简单的进入效果

这是一个比较简单的小例子&#xff0c;实现如图效果仅仅用css3就可以达到这种效果&#xff0c;代码如下&#xff1a;.div {position: relative;top: 20px;height: 300px;width: 200px;margin: 0 auto;background: blue;float: left;margin-left: 20px;}.div2 {position: relati…

计算机专业中agp是什么意思,计算机中AGP是什么意思及其特性介绍

AGP (Accelerated Graphic Ports 或者 Advanced Graphic Ports) 是当前已经被淘汰的图形系统接口。这项技术始于十四年以前&#xff0c;当时的3D图形加速技术开始流行并且迅速普及&#xff0c;为了使系统和图形加速卡之间的数据传输获得比PCI总线更高的带宽&#xff0c;AGP便应…

统计应用计算机基础,计算机基础应用试题及答案参考

计算机基础应用试题及答案参考计算机技术与通信技术的结合&#xff0c;使计算机网络得到发展。信息服务业的兴起使社会信息资源得到更广泛的利用。下面是小编为大家搜索整理的计算机应用基础训练题&#xff0c;希望能给大家带来帮助!1、计算机病毒是(B)。A.计算机系统自生的B.一…

计算机目标导学方法,计算机教学计划

计算机教学计划信息技术课程是一门特殊比较的学科&#xff0c;操作性较强&#xff0c;大部分学生对此相当感兴趣。 以下是为大家整理的计算机教学计划&#xff0c;希望对你们有所帮助&#xff01;篇一&#xff1a;计算机教学计划本学期我任教11级护理班的计算机应用基础课程教学…