农夫过河问题的求解

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

--------------------------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
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员Android

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

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

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

打赏作者

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

抵扣说明:

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

余额充值