问题描述
一个农夫带着一只狼,一只羊和一棵白菜,身处河的南岸,他要把这些东西全部运到北岸,遗憾的是他只有一只小船,小船只能容下他和一件物品。这里只能是农夫来撑船,同时因为狼吃羊、羊吃白菜,所以农夫不能留下羊和狼或者羊和白菜在河的一边,而自己离开,好在狼属于肉食动物,不吃白菜。农夫怎样才能把所有的东西安全运过河呢?实验内容如下。
(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");