Ⅰ C语言之过河问题
/* 程序名称:shr.c */
/* 功 能:安全过河,初始状态可变,寻找一种方案 */
#define N 30
int x[N],y[N],u[6],v[6],k;
/* x,y:状态值,分别表示此岸商人、随从数;u,v:决策值,分别表示船上商人、随从数;*/
/* k:决策步数;k的奇偶性标志着船在河的此岸或彼岸 */next(int k,int i)
/* 计算下一状态x,y */
{ if(k%2) /* k+1 为偶数,船从此岸到彼岸 */
{ x[k+1]=x[k]-u[i];
y[k+1]=y[k]-v[i];
}
else /* k+1 为奇数,船从彼岸到此岸 */
{ x[k+1]=x[k]+u[i];
y[k+1]=y[k]+v[i];
}
return;
}allow(int p,int q)
/* 判定状态是否允许,是否重复 */
{ int ok,j; /* ok:标记状态是否允许,是否重复;j:循环变量 */
if(p<0 || p>x[1] || p!=0 && q>p ||(x[1]-p)!=0 && (y[1]-q)>(x[1]-p) || q<0 || q>y[1])
ok=0; /* 此时状态不属于允许集 */
else
{ for(j=k-1;j>0;j-=2) /* 是否重复与船在河的哪一岸有关 */
if(p==x[j] && q==y[j] )
{ ok=0; /* 此时状态出现重复 */
break;
}
if(j<=0)
ok=1; /* 此时状态属于允许集,且不重复 */
}
return ok;
}main()
{ int i,j,m[N],flag=1;
/* m:采用的决策序号,flag:回溯标记 */
u[1]=2; v[1]=0; /* 给决策编号并赋值 */
u[2]=0; v[2]=2;
u[3]=1; v[3]=0;
u[4]=0; v[4]=1;
u[5]=1; v[5]=1;
k=1; /* 从初始状态出发 */
printf("qing shu ru chu shi zhuang tai:\n shangren ren shu=");
scanf("%d",&x[k]);
printf(" sui cong ren shu=");
scanf("%d",&y[k]);
while(flag)
{ for(i=1;i<6;i++) /* 遍历各种决策 */
{ next(k,i); /* 计算下一状态 */
if(allow(x[k+1],y[k+1])) /* 若新状态允许且不重复 */
{ m[k]=i; /* 记录采用的决策序号 */
if(x[k+1]==0 && y[k+1]==0) /* 若到达目标状态 */
{ printf("chu shi :shang ren %d sui cong%d\n",x[1],y[1]); /* 输出结果 */
for(j=1;j<=k;j++)
printf(" di %2d ci %d %d\n",j,x[j+1],y[j+1]);
flag=0;
break;
}
else /* 若未到达目标状态 */
{ k++; /* 生成下一步的步数值 */
break; /* 遍历终止,进入下一步 */
}
}
else /* 若新状态不允许或重复 */
{ while(i==5) /* 本步决策已经遍历时 */
{ if(k==1)
{ printf("ben ti wu jie! \n");
flag=0;
break;
}
else /* 未到达初始状态 */
{ k--; /* 回溯——退回1步,寻找新路径 */
i=m[k];
}
}
if(flag)
continue; /* 本步决策尚未遍历时 */
else
break; /* 本步决策遍历时 */
}
}
}
}
Ⅱ C语言 关于人过河的问题的源程序
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STEP 20
//index: 0 - 狼,1-羊,2-菜,3-农夫,value:0-本岸,1-对岸
int a[MAX_STEP][4];
int b[MAX_STEP];
char *name[] =
{
"空手",
"带狼",
"带羊",
"带菜"
};
void search(int iStep)
{
int i;
if (a[iStep][0] + a[iStep][1] + a[iStep][2] + a[iStep][3] == 4)
{
for (i = 0; i < iStep; i++)
{
if (a[i][3] == 0)
{
printf("%s到对岸\n", name[b[i] + 1]);
}
else
{
printf("%s回本岸\n", name[b[i] + 1]);
}
}
printf("\n");
return;
}
for (i = 0; i < iStep; i++)
{
if (memcmp(a[i], a[iStep], sizeof(a[i])) == 0)
{
return;
}
}
if (a[iStep][1] != a[iStep][3] && (a[iStep][2] == a[iStep][1] || a[iStep][0] == a[iStep][1]))
{
return;
}
for (i = -1; i <= 2; i++)
{
b[iStep] = i;
memcpy(a[iStep + 1], a[iStep], sizeof(a[iStep + 1]));
a[iStep + 1][3] = 1 - a[iStep + 1][3];
if (i == -1)
{
search(iStep + 1);
}
else if (a[iStep][i] == a[iStep][3])
{
a[iStep + 1][i] = a[iStep + 1][3];
search(iStep + 1);
}
}
}
int main()
{
search(0);
return 0;
}
结果:
带羊到对岸
空手回本岸
带狼到对岸
带羊回本岸
带菜到对岸
空手回本岸
带羊到对岸
带羊到对岸
空手回本岸
带菜到对岸
带羊回本岸
带狼到对岸
空手回本岸
带羊到对岸
Press any key to continue
Ⅲ 急求数据结构《农夫过河问题》课程设计(C/C++)源代码,编程要体现过河的先后顺序实现农夫过河过程,谢谢
#include<stdio.h>
int s[100],t=0;
void BA(int a[4],int b[4]);
void xu(int a[4])
{
int i,j,k;
for(i=0;i<3;i++)for(j=i+1;j<4;j++)if(a[i]<a[j])
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
}
int f(int a[4],int x)
{
int i,j=0,b[4];
for(i=0;a[i];i++)
{
if(i==x)continue;
b[j]=a[i];
if(j&&b[j]==b[j-1]-1)return 1;
j++;
}
return 0;
}
int g()
{
int i,r;
for(i=t-1;i>=t/2;i-=2)
{
for(r=0;r<t-i;r++)if(s[t-r]!=s[i-r])break;
if(r==t-i)break;
}
if(i<t/2)return 0;
else return 1;
}
void huan(int a[4],int b[4],int x)
{
int i;
for(i=0;a[i]!=x;i++);
a[i]=0;
b[3]=x;
xu(a);
xu(b);
}
void AB(int a[4],int b[4])
{
int i;
for(i=0;a[i-1]||i==0;i++)
{
if(f(a,i))continue;
s[t]=a[i];
if(g())continue;
huan(a,b,s[t]);
t++;
if(a[0]==0)break;
BA(a,b);
if(a[0]==0)break;
t--;
huan(b,a,s[t]);
}
}
void BA(int a[4],int b[4])
{
int i;
for(i=0;b[i-1]||i==0;i++)
{
if(f(b,i))continue;
s[t]=b[i];
if(g())continue;
huan(b,a,s[t]);
t++;
AB(a,b);
if(a[0]==0)break;
t--;
huan(a,b,s[t]);
}
}
void main()
{
int i,a[4]={3,2,1},b[4]={0};
AB(a,b);
for(i=0;i<t;i++)
{
if(i%2)printf("农夫从B岸到A岸:");
else printf("农夫从A岸到B岸:");
switch(s[i])
{
case 0:printf("什么都不带");break;
case 1:printf("把狼带过河");break;
case 2:printf("把羊带过河");break;
case 3:printf("把菜带过河");break;
}
printf("\n");
}
}
Ⅳ C语言过河问题,编程!谢谢了,急!
你好,我来为你解答:
解法如下:
1.农夫带羊过去,自己回来
2.农夫带狼过去,带羊回来
3.农夫带白菜过去,自己回来
4.农夫带羊过去
全部安全过岸.
程序暂时没有时间做
Ⅳ 急!!09年9月16号中午之前给出答案 求农夫过河问题用C语言编程
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STEP 20
//index: 0 - 狼,1-羊,2-菜,3-农夫,value:0-本岸,1-对岸
int a[MAX_STEP][4];
int b[MAX_STEP];
char *name[] =
{
"空手",
"带狼",
"带羊",
"带菜"
};
void search(int iStep)
{
int i;
if (a[iStep][0] + a[iStep][1] + a[iStep][2] + a[iStep][3] == 4)
{
for (i = 0; i < iStep; i++)
{
if (a[i][3] == 0)
{
printf("%s到对岸\n", name[b[i] + 1]);
}
else
{
printf("%s回本岸\n", name[b[i] + 1]);
}
}
printf("\n");
return;
}
for (i = 0; i < iStep; i++)
{
if (memcmp(a[i], a[iStep], sizeof(a[i])) == 0)
{
return;
}
}
if (a[iStep][1] != a[iStep][3] && (a[iStep][2] == a[iStep][1] || a[iStep][0] == a[iStep][1]))
{
return;
}
for (i = -1; i <= 2; i++)
{
b[iStep] = i;
memcpy(a[iStep + 1], a[iStep], sizeof(a[iStep + 1]));
a[iStep + 1][3] = 1 - a[iStep + 1][3];
if (i == -1)
{
search(iStep + 1);
}
else if (a[iStep][i] == a[iStep][3])
{
a[iStep + 1][i] = a[iStep + 1][3];
search(iStep + 1);
}
}
}
int main()
{
search(0);
return 0;
}
结果:
带羊到对岸
空手回本岸
带狼到对岸
带羊回本岸
带菜到对岸
空手回本岸
带羊到对岸
带羊到对岸
空手回本岸
带菜到对岸
带羊回本岸
带狼到对岸
空手回本岸
带羊到对岸
Press any key to continue
加我的qq号 476758573
我帮你详细解释再给你流程图啊
虽然时间过了 但希望有用啊
Ⅵ 农夫,狼,山羊过河问题编程方案,急,谢谢
两个答案
先带山羊过去,再带白菜过去.把山羊带回来.狼带过去,再回来带山羊。
2.先带山羊过去,再带狼过去.把山羊带回来.白菜带过去,再回来带山羊
Ⅶ 老虎过河问题 C语言编程
是不是3只母老虎和三只小老虎都要过河啊? 如果是的话,就这样吧:AB一起过河去,B再回来接C,C又过河去接c,c再过河去接a,a过河去接b.这就是思路,至于C语言怎么弄,你自己应该知道吧!因为你要用C语言编辑,说明你在学习C语言,如果真的要我用C语言编辑请回个话.
Ⅷ 迷你编程过河问题
根据他的设置领取东西,因此,直接领取即可,如果不懂,可以咨询管理,或者咨询官方,然后领龋。
解这道智力题我并没有用什么特别的算法,所以就算你没学过动态规划、回溯、矩阵也可以求解这道题,因为我用的是最简单粗暴的方法。
方法
首先,开辟一个数组a,表示这8个人,这8个人我是规定好顺序的,在在在从下标0到8分别表示猎人、男、女、狼、男1、男2、女1、女2。数组a存储的是每个人的位置状态,0表示人在此岸,1表示在对岸。同样的,船也要有位置状态,所以我定义了一个变量boat,0表示船在此岸,在在1表示在对岸。表示船与该人在同一岸,可以上船。然后,每一次渡河都需要记录下来。所以,在我开辟了两个数组b1,存储每一次渡河的两个人是谁.
Ⅸ C语言问题 过河
思路:
1.将桥看作数组,没有石子的赋值为0,有石子的赋值为1
2.青蛙跳,由最长距离开始试跳,若无石子则前进,有石子则缩短试跳距离,直到最小距离为止。若最小距离仍碰到石子,则说明避不开石子,必踩石子数增加,同时取最长距离跳(尽快过桥)
3.重复进行2直到过完桥为止
代码如下,为了编程方便加了些文字说明及桥的情况,可根据需要删除,动态数组不熟练,所以没用,楼主自己改吧
#include <stdio.h>
void main()
{ int bridgelen;
int mindis,maxdis,stonenum;
int stone[100];
int sum=0;
int bristone[100]={0};
int index;
int i;
printf("Input the length of bridge:");
scanf("%d",&bridgelen);
printf("Input the range of distance:");
scanf("%d%d",&mindis,&maxdis);
printf("Input the number of stone");
scanf("%d",&stonenum);
for(i=0;i<stonenum;i++)
{ scanf("%d",&stone[i]);
bristone[stone[i]]=1;
}
for(i=0;i<bridgelen;i++)
printf("%5d",bristone[i]);
printf("\n");
index=0;
while(index<bridgelen)
{ for(i=maxdis;i>=mindis;i--)
if(bristone[index+i]==0)
break;
if(i<mindis)
{ sum++;
index+=maxdis;
}
else index+=i;
}
printf("%d",sum);
}
Ⅹ 编程问题:渡河问题。一个农夫带着一条狼、一只山羊和一篮蔬菜过河,
首先把羊运到对岸(因为狼不吃菜),再把狼运到对岸同时把羊带回来放到岸这边(有农夫在羊不会吃菜),这一次把菜运到对岸空着回来(理由仍然是狼不吃菜),最后再次把羊运到对岸完成渡河。