古代谜题
一个农夫带着一只狼、一只羊和一棵白菜来到河边。他需要把它们用船带到河对岸。然而,这艘船只只能容下农夫本人和另外一样东西(要么是狼,要么是羊,要么是白菜)。如果农夫不在场的话,狼就会吃掉羊,羊也会吃掉白菜。请为农夫解决这个问题,或者证明它无解。请高手帮忙~~~~~~~~--------------------编程问答-------------------- 先带羊,然后回来带狼或白菜,过去后将羊带回,再把剩下的白菜或狼带到对岸,最后回来把羊带去,任务完成. --------------------编程问答-------------------- 好像是小学三年级的时候就知道了! --------------------编程问答-------------------- 不要用程序写吧。。 --------------------编程问答-------------------- 1.农夫+羊过去 1.农夫+羊过去
2.农夫回来 2.农夫回来
3.农夫+狼过去 3.农夫+白菜过去
4.农夫+羊回来 4.农夫+羊回来
5.农夫+白菜过去 5.农夫+狼过去
6.农夫回来 6.农夫回来
7.农夫+羊过去 7.农夫+羊过去 --------------------编程问答-------------------- 脑筋急转弯!!!怎么跑这来问了。 --------------------编程问答-------------------- 能不能提供具体的算法。 --------------------编程问答-------------------- #include "stdio.h"
#include "stdlib.h"
void farmerproblem();
#define MAXQSIZE 100
typedef int ElemType;
typedef struct {
ElemType data[MAXQSIZE];
int front,rear;
}SqQueue;
void Init_SqQueue(SqQueue*Q)
{
Q->front=Q->rear=0;
}
int Empty_SqQueue(SqQueue*Q)
{
return(Q->rear=Q->front);
}
void In_SqQueue(SqQueue *Q,int e)
{
if(Q->rear==MAXQSIZE) return;
Q->data[Q->rear]=e;
Q->rear+=1;
}
void Out_SqQueue(SqQueue *Q,int *e)
{
if(Q->rear==Q->front) return;
*e=Q->data[Q->front];
Q->front+=1;
}
int farmer(int location)
{
return(0!=(location & 0x08));
}
int wolf(int location)
{
return(0!=(location & 0x04));
}
int cabbage(int location)
{
return(0!=(location & 0x02));
}
int goat(int location)
{
return(0!=(location & 0x01));
}
int safe(int location)
{
if(goat(location)==cabbage(location)&&goat(location)!=farmer(location)) return(0);
if(goat(location)==wolf(location)&&goat(location)!=farmer(location)) return(0);
return(1);
}
main()
{
farmerproblem();
getchar();
}
void farmerproblem()
{
int movers,location,newlocation;
int route[16];/*记录已考虑的状态路径*/
int i;
SqQueue moveto;
/*准备初始值*/
Init_SqQueue(&moveto);
In_SqQueue(&moveto,0x00);
for(i=0;i<16;i++) route[i]=-1;
route[0]=0;
/*开始移动*/
while(!Empty_SqQueue(&moveto)&&(route[15]==-1))
/*得到现在的状态*/
{
Out_SqQueue(&moveto,&location);
for(movers=1;movers<=8;movers<<=1)/*农夫总是在移动,随农夫的移动的也只能是农夫同侧的东西*/
{
if(((location & 0x08)!=0)==((location & movers)!=0))
{
newlocation=location^(0x08|movers);
if(safe(newlocation)&&(route[newlocation]==-1))
{
route[newlocation]=location;
In_SqQueue(&moveto,newlocation);
}
}
}
}
if(route[15]!=-1)
{
printf("\n the reverse path is:");
for(i=15;i>=0;i=route[i])
{
printf("\n the location is:%d",i);
if(i==0) break;
}
}
else printf("no path");
}
这是用数据结构做的我从书上拷下来的 看对你有什么帮助没
从初始状态(0000)到结束状态(1111)的动作
规定在南岸用0表示 在北岸用1表示
都在南岸的时候0(0000);
农夫把羊带到北岸:9(1001);
农夫独自回到南岸;1(0001);
农夫把白菜带到北岸:11(1011);
农夫把羊带回南岸:2(0010);
农夫把狼带到北岸:14(1110);
农夫独自回到南岸:6(0110);
农夫把羊带到北岸:15(1111);
农夫把羊带到北岸:9(1001);
农夫独自回到南岸;1(0001);
农夫把狼带到北岸:13(1101);
农夫把羊带回南岸:4(0100);
农夫把白菜带到北岸:14(1110);
农夫独自回到南岸:6(0110);
农夫把羊带到北岸:15(1111); --------------------编程问答-------------------- 感谢了! --------------------编程问答-------------------- 怎么我调试的时候总是有个错误说有个地址不能read? --------------------编程问答-------------------- 给分吧! --------------------编程问答-------------------- 开裆裤的时候的问题。擦擦 --------------------编程问答--------------------
补充:Java , 非技术区