农夫过河的第二条路径

本文介绍了使用队列和广度优先搜索策略解决农夫过河问题,包括如何确保安全状态、寻找第二条路径的算法,并提供了代码运行结果。虽然此方案在已知存在两条路径的情况下有效,但对寻找所有路径的情况,推荐参考其他更通用的解法。
摘要由CSDN通过智能技术生成

问题描述

一个农夫带着一只狼,一只羊和一棵白菜,身处河的南岸,他要把这些东西全部运到北岸,遗憾的是他只有一只小船,小船只能容下他和一件物品。这里只能是农夫来撑船,同时因为狼吃羊、羊吃白菜,所以农夫不能留下羊和狼或者羊和白菜在河的一边,而自己离开,好在狼属于肉食动物,不吃白菜。农夫怎样才能把所有的东西安全运过河呢?实验内容如下。
(1) 设计物品位置的表示方法和安全判断算法;
(2) 可以设计队列的存储结构并实现队列的基本操作;
(3) 采用广度优先策略设计可行的过河算法;
(4) 输出要求:按照顺序输出一种可行的过河方案;
(5) 拓展:输出农夫过河问题的所有路径。

问题说明
解决农夫过河问题的方法有很多,比如队列、树、图等等,在这里笔者将介绍用队列解决的方案,并重点介绍如何找到第二条路径,详细分析请看代码注释。
(图 解决方案的看这里 http://www.cnblogs.com/a1982467767/p/8889683.html

问题解决

循环队列的结构体

typedef int DataType;
struct Queue
{
   
    int Max;
    int f,r;                            //头指针尾指针
    DataType *elem;                     //循环队列的元素
};
typedef struct Queue *SeqQueue;

循环队列的各种操作

SeqQueue SetNullSeqQueue(int m)       //空队列的创建
{
   
    SeqQueue squeue;
    squeue=(SeqQueue)malloc(sizeof(struct Queue));
    if(squeue==NULL)
    {
   
        printf("Fail!\n");
        return NULL;
    }
    squeue->elem = (int*) malloc(sizeof(DataType)*m);
    if(squeue->elem!=NULL)
    {
   
        squeue->Max=m;
        squeue->f=0;
        squeue->r=0;
        return squeue;
    }
}

int IsNullSeqQueue(SeqQueue squeue)     //队列判空
{
   
    return(squeue->f==squeue->r);
}

void EnterSeqQueue(SeqQueue squeue,DataType x)               //入队列
{
   
    if((squeue->r+1)%squeue->Max==squeue->f)
        printf("It is FULL Queue!\n");
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值