主题:农夫过河的答案!
不游泳的鱼
[专家分:620] 发布于 2004-05-05 10:46:00
农夫过河。一个农夫带着一只狼,一只羊和一些菜过河。河边只有一条一船,由
于船太小,只能装下农夫和他的一样东西。在无人看管的情况下,狼要吃羊,羊
要吃菜,请问农夫如何才能使三样东西平安过河。
C++
回复列表 (共21个回复)
沙发
新人上路 [专家分:220] 发布于 2004-04-20 12:15:00
先带羊,空船回,再带狼,载羊回,然后带菜,空船回,最后带羊
板凳
不游泳的鱼 [专家分:620] 发布于 2004-05-05 10:44:00
答案给大家看看!!
#include<iostream.h>
#define MaxNumVertices 10 //最大顶点数
typedef enum {FALSE,TRUE}Boolean;
typedef struct //图的顶点类型
{
int Farmer,Wolf,Sheep,Veget;
}VexType;
typedef struct
{
int VertexNum,CurrentEdges; //图的当前顶点数和边数
VexType VerticesList[MaxNumVertices]; //顶点向量(代表顶点)
int Edge[MaxNumVertices][MaxNumVertices];//邻接矩阵
//用于存储图中的边,其矩阵元素个数取决于顶点个数,与边数无关
}AdjGraph; //定义图的邻接矩阵存储结构
Boolean visited[MaxNumVertices]; //对已访问的顶点进行标记(图的遍历)
int path[MaxNumVertices];
//保存DFS搜索到的路径,即与某顶点到下一顶点的路径
int locate(AdjGraph *G,int F,int W,int S,int V)
//查找顶点(F,W,S,V)在顶点向量中的位置
{
int i;
for(i=0;i<G->VertexNum;i++)
if(G->VerticesList[i].Farmer==F && G->VerticesList[i].Wolf==W &&
G->VerticesList[i].Sheep==S && G->VerticesList[i].Veget==V)
return(i); //返回当前位置
return (-1); //没有找到此顶点
}
int is_safe(int F,int W,int S,int V)
//判断目前的(F,W,S,V)是否安全
{
if(F!=S && (W==S||S==V))
return (0);
//当农夫与羊不在一起时,狼与羊或羊与白菜在一起是不安全的
else //否则安全
return (1); //安全返回1
}
int is_connected(AdjGraph *G,int i,int j)
//判断状态i与状态j之间是否可转换
{
int k=0;
if(G->VerticesList[i].Wolf!=G->VerticesList[j].Wolf)
k++;
if(G->VerticesList[i].Sheep!=G->VerticesList[j].Sheep)
k++;
if(G->VerticesList[i].Veget!=G->VerticesList[j].Veget)
k++;
if(G->VerticesList[i].Farmer!=G->VerticesList[j].Farmer && k<=1)
//以上三个条件不同时满足两个且农夫状态改变时,返回真
//也即农夫每次只能带一件东西过桥
return(1);
else
return(0);
}
void CreateG(AdjGraph*G)
{
int i,j,F,W,S,V;
i=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(is_safe(F,W,S,V))
{
G->VerticesList[i].Farmer=F;
G->VerticesList[i].Wolf=W;
G->VerticesList[i].Sheep=S;
G->VerticesList[i].Veget=V;
i++;
}
G->VertexNum=i;
for(i=0;i<G->VertexNum;i++) //邻接矩阵初始化即建立邻接矩阵
for(j=0;j<G->VertexNum;j++)
if(is_connected(G,i,j))
G->Edge[i][j]=G->Edge[j][i]=1;
//状态i与状态j之间可转化,初始化为1,否则为0
else
G->Edge[i][j]=G->Edge[j][i]=0;
return;
}
void print_path(AdjGraph *G,int u,int v)
//输出从u到v的简单路径,即顶点序列中不重复出现的路径
{
int k;
k=u;
while(k!=v)
{
cout<<"("<<G->VerticesList[k].Farmer<<","<<G->VerticesList[k].Wolf
<<","<<G->VerticesList[k].Sheep<<","<<G->VerticesList[k].Veget<<")";
cout<<endl;
k=path[k];
}
cout<<"("<<G->VerticesList[k].Farmer<<","<<G->VerticesList[k].Wolf
<<","<<G->VerticesList[k].Sheep<<","<<G->VerticesList[k].Veget<<")";
cout<<endl;
}
void DFS_path(AdjGraph *G,int u,int v)
//深度优先搜索从u到v的简单路径
//DFS--Depth First Search
{
int j;
visited[u]=TRUE; //标记已访问过的顶点
for(j=0;j<G->VertexNum;j++)
if(G->Edge[u][j] && !visited[j] && !visited[v])
{
path[u]=j;
DFS_path(G,j,v);
}
}
void main()
{
int i,j;
AdjGraph graph;
CreateG(& graph);
for(i=0;i<graph.VertexNum;i++)
visited[i]=FALSE; //置初值
i=locate(&graph,0,0,0,0);
j=locate(&graph,1,1,1,1);
DFS_path(&graph,i,j);
if(visited[j])
print_path(&graph,i,j);
return;
}
3 楼
goner [专家分:100] 发布于 2004-05-05 13:58:00
1楼说对了,不过只是什么用计算机语言实现的问题
4 楼
tangjuan [专家分:0] 发布于 2004-05-05 22:05:00
怎么一开始的那个#include<iostream.h>
就出现了错误!说什么Unable to open include file<iostream.h>
这是什么函数呀?起什么作用的?
5 楼
不游泳的鱼 [专家分:620] 发布于 2004-05-06 09:44:00
老大那是TC3.0的函数
7 楼
lheng [专家分:1490] 发布于 2004-05-09 10:23:00
请问用递归是不是会好点
8 楼
lheng [专家分:1490] 发布于 2004-05-09 11:25:00
我刚刚用递归写的
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
void getnum()
{
static int f=1,v=0,w=0,s=0;
static int farmer=1,wolf=0,sheep=0,veget=0;
if(s==w&&w==v&&v==1)
{
cout<<"已经过河完毕!"<<endl;
exit(1);
}
if((w==s&&s==v)&&(s!=f))
{
cout<<"将羊带到河的对岸!"<<endl;
s=1;
f=0;
getnum();
}
if(f==0&&w==v)
{
cout<<"农夫一个人过河!"<<endl;
f=1;
getnum();
}
if(s==v&&s!=f&&f==w)
{
if(v==1)
{
cout<<"将菜带回河岸!"<<endl;
v=0;
f=1;
}
else
if(v==0)
{
cout<<"将菜带到河的对岸!"<<endl;
v=1;
f=0;
}
getnum();
}
if(w==s&&f!=s&&f==v)
{
if(s==1)
{
cout<<"将羊带回河岸!"<<endl;
s=0;
f=1;
}
else
if(s==0)
{
cout<<"将羊带到河的对岸!"<<endl;
s=1;
f=0;
}
getnum();
}
if(f!=w&&w==v&&v==0)
{
cout<<"将狼带过对岸!"<<endl;
f=0;
w=1;
getnum();
}
if(f!=s&&w==v&&v==1)
{
cout<<"将羊带过对岸!"<<endl;
f=0;
s=1;
getnum();
}
}
void main()
{
getnum();
}
9 楼
不游泳的鱼 [专家分:620] 发布于 2004-05-09 11:56:00
少判断一个了!!
羊先过
可以回来选择带菜或狼
在把羊带回去后
在带狼或菜 //第一次带狼 现在就带菜
在空手回来把羊带过去
10 楼
xylan [专家分:0] 发布于 2004-10-28 21:11:00
请问楼主:这个程序怎么在TC3.0里运行呢?需要改什么东西?出现的错误提示是:error directive:must use c++ for the type
可是我没有vc,望哪位大人指点,多谢!
我来回复