农夫过河问题的求解

            前几天学校让做课程设计,选了农夫过河问题的课程设计,采用图是深度优先的遍历方法来解决农夫过河的问题,所用的代码如下:

--------------------------farmer.c --------------------

 

#include "stdio.h"
#define MAX 20


typedef struct {
int farmer, wolf, sheep, vegetable;
}VERTEX;

VERTEX vx[MAX]; 
//而为数组存处有向图的邻接矩阵 
int matrix[MAX][MAX], vnum, visited[MAX], path[MAX];
//判断是否安全
int safe(int f, int w, int s, int v)


{
if (f!=s && (w==s||s==v))//当农夫和羊,(羊或者白菜,浪或者羊中的一种),不再同一岸边时
return (0);
else
return (1);


}
int connected(int p, int q) {// 判断顶点vx[p]和vx[q]是否连接
int k=0;
if (vx[p].wolf!=vx[q].wolf) 
k++;


if (vx[p].sheep!=vx[q].sheep) 
k++;


if (vx[p].vegetable!=vx[q].vegetable ) 
k++;



if (vx[p].farmer!=vx[q].farmer&&k<=1) {
return (1);


} else
return (0);
}


void create_graph() {   // 创建图
int i, j, f, w, s, v;
vnum=0;
for (f = 0; f <=1; f++)
for (w = 0; w <=1; w++)
for (s = 0; s<=1; s++)
for (v = 0; v <= 1; v++)
if (safe(f, w, s, v)==1) {


vx[vnum].farmer=f;
vx[vnum].wolf=w;
vx[vnum].sheep=s;
vx[vnum].vegetable=v;
vnum++;
}
for (i = 0; i < vnum; i++)
for (j=0; j<vnum; j++)
if (connected(i, j)==1) {
matrix[i][j]=1;


} else
matrix[i][j]=0;
return;


}


void print_path(int u, int v) { // 输出方法  
int k=u;
while (k!=v) {


printf("%d %d %d %d\n", vx[k].farmer,vx[k].wolf,vx[k].sheep,
vx[k].vegetable);
k=path[k];
}
printf("%d %d %d %d\n", vx[k].farmer, vx[k].wolf, vx[k].sheep, vx[k].vegetable);
}


void dfs_path(int u, int v) {
int j;
visited[u]=1;
for (j = 0; j < vnum; j++)


if (matrix[u][j]==1 && visited[j]==0 && visited[v]==0) {
path[u]=j;
dfs_path(j, v);


}
}


int main() {
int i, j;


create_graph(); 


for (i = 0; i < vnum; ++i)
visited[i]=0;
i=0;
j=vnum-1;
dfs_path(i, j);


if (visited[j]==1) {


printf(">>>>the path is >>>\n");
print_path(i, j);


}
getchar();
}



运行结果如下:
/* 定义四个成员 农夫,狼 羊 白菜 0 表示左岸 1 表示 右岸 
fw s v
0 0 0 0       开始都在左岸
1 0 1 0       农夫把羊带到右岸
0 0 1 0       农夫回来,羊在右岸
1 0 1 1       农夫把白菜运到右岸
0 0 0 1       农夫和羊一块回左岸
1 1 0 1        农夫和狼 去右岸
0 1 0 1        农夫回来
1 1 1 1        农夫回来带羊到右岸
*/

 

 

 

 

 

至此,本篇已结束,如有不对的地方,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

如有侵权,请联系小编,小编对此深感抱歉,届时小编会删除文章,立即停止侵权行为,请您多多包涵。

既然都看到这里,领两个红包在走吧!
以下两个红包每天都可以领取

1.支付宝搜索 522398497,或扫码支付宝红包海报。

支付宝扫一扫,每天领取大红包

2.微信红包,微信扫一扫即可领取红包

 

微信扫一扫,每天领取微信红包

小礼物走一走,来简书关注我

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
农夫过河问题是一个经典的人工智能问题,可以用C语言来解决。 假设有一位农夫、一只狼、一只羊和一桶菜要过一条河。但是小船只能载一样东西,而且如果狼和羊在一起,狼就会吃掉羊;羊和菜在一起,羊就会吃掉菜。请问农夫应该如何安排才能让所有东西都安全过河? 下面是一种可能的C语言实现: ```c #include <stdio.h> int main() { int farmer = 1, wolf = 1, sheep = 1, cabbage = 1; // 1 表示在左岸,0 表示在右岸 printf("农夫过河问题求解:\n"); printf("初始状态: 农夫 狼 羊 菜\n"); printf(" %4s %2s %2s %2s\n", farmer ? "左岸" : "右岸", wolf ? "狼" : "", sheep ? "羊" : "", cabbage ? "菜" : ""); while (wolf || sheep || cabbage) { // 只要还有未过河的物品 int boat = 0; // 0 表示小船在右岸 if (farmer) { // 如果农夫在左岸,就把一样物品带到右岸 if (wolf) { // 带狼 wolf = 0; boat = 1; } else if (sheep) { // 带羊 sheep = 0; boat = 1; } else if (cabbage) { // 带菜 cabbage = 0; boat = 1; } } else { // 如果农夫在右岸,就把一样物品带到左岸 if (!wolf && !sheep && cabbage) { // 如果狼和羊在左岸,菜和农夫也在左岸,就把菜带到右岸 cabbage = 0; boat = 1; } else if (!wolf && sheep && !cabbage) { // 如果狼和菜在左岸,羊和农夫也在左岸,就把羊带到右岸 sheep = 0; boat = 1; } else if (wolf && !sheep && !cabbage) { // 如果羊和菜在左岸,狼和农夫也在左岸,就把狼带到右岸 wolf = 0; boat = 1; } } farmer = !farmer; // 农夫过河 printf("一次过河:农夫 狼 羊 菜\n"); printf(" %4s %2s %2s %2s\n", farmer ? "左岸" : "右岸", wolf ? "狼" : "", sheep ? "羊" : "", cabbage ? "菜" : ""); if (!boat) { // 如果小船在右岸,就等待一段时间 printf("农夫等待...\n"); } } printf("所有物品都安全到达右岸!\n"); return 0; } ``` 这段代码实现了农夫过河问题求解,输出了农夫每次过河的状态,直到所有物品都安全到达右岸。在实现过程中,我们使用了一系列的 if 语句来判断农夫每次过河所带的物品,以及是否需要等待小船回到右岸。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Android

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值