农夫过河问题的求解
前几天学校让做课程设计,选了农夫过河问题的课程设计,采用图是深度优先的遍历方法来解决农夫过河的问题,所用的代码如下:
--------------------------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.微信红包,微信扫一扫即可领取红包
微信扫一扫,每天领取微信红包
小礼物走一走,来简书关注我