当前位置:首页 » 编程语言 » C语言过河死课本有吗
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

C语言过河死课本有吗

发布时间: 2022-06-23 17:53:45

1. c语言 兔子过河

明白楼主的意思了。

是要个“兔子过河”的游戏,场景是:一只兔子要过到对岸 中间有一条河 河上有浮动的木板

2. c语言 《过河》

先带兔子过河,再回来,再带狮子过河,顺便把兔子带回来,再把白菜带过河,然后回来再把兔子带过去,就OK了

这个主要是人不在的时候,狮子会吃兔子,兔子会出白菜,但狮子肯定不会吃白菜是不,就根据这个想不就是了

简单的逻辑问题,我只说算法,你定义两个数组,数组一代表河这边的东西,数组二代表河那边的东西(其中加入一个空白东西,也就是不带东西的选择),循环带数组1中的东西,每次过河带东西之后,判断两个数组中是否有吃与被吃的关系(这个定义成一个函数),然后就是回来,回来的时候循环带数组2中的东西,判断两个数组中是否有吃与被吃的关系,这样循环下去,直到河这边的东西为空的时候就完了

3. C语言 过河问题

我觉得你应该先把每一对好友城市跨度的绝对值算出来|C-D|, 然后对跨度绝对值从小到大排序。默认最小的一对城市开通航道,然后是其次小的开通航道并判断是否和前面已经开通了航道交叉。
如样例
30 4
7
22 4 (第1对,跨度 18)
2 6 (第2对,跨度 4)
10 3 (第3对,跨度 7)
15 12 (第4对,跨度 3)
9 8 (第5对,跨度 1)
17 17 (第6对,跨度 0)
4 2 (第7对,跨度 2)

因此,先开通第6对好友城市,其次是第5对、再其次是第7对,依次类推。注意:判断新航道与已开通的所有航道是否交叉,都不交叉才可以开通这个新航道,否则不能。判断两条航线交叉的方法是C1-C2,D1-D2的值是否异号,异号则交叉。

这里你题目描述的方向不是太清楚,根据题意可以猜测出:河是正东西走向,城市在和两岸,因此是南北分布。只是这句话“正数C,D(C、D〈=x),描述每一对友好城市沿着河岸与西边境线的距离”。那这样一来,告诉河的宽度和长度似乎没有意义。

4. C语言问题 过河

sunlight12346正解,不过还可以优化一下
构造一个updateMin函数,功能为,计算青蛙从x开始跳到L所需要踩的石子数,如果结果比当前计算得到的最小数curMin小,则返回计算结果,如果大于等于curMin,则返回curMin,通过递归计算最终的最小值。可以稍作剪枝,如果递归过程中,已踩的石子数stepedStNum已经大于等于curMin,那么就返回curMin,不必要再继续计算下去。

#include <stdio.h>
void main()
{
int x, s, t, l, curMin, stoneNum, i, temp;
int stoneLoc[100]={0};
int stepedStNum = 0;
x = 0;
printf("Input the length of bridge:");
scanf("%d",&l);
printf("Input the range of distance:");
scanf("%d%d",&s,&t);
printf("Input the number of stone:");
scanf("%d",&stoneNum);
for ( i=0; i<stoneNum; i++)
{
scanf("%d", &stoneLoc[i]);
}
curMin = l;
curMin = updateMin(x, stepedStNum, s, t, l, stoneLoc, stoneNum, curMin);
printf("%d", curMin);
}

int updateMin(int x, int stepedStNum, int s, int t, int l, int stoneLoc[], int stoneNum, int curMin)
{
int i = 0;
if (x >= l)
{
return stepedStNum;
}
for (i=0; i<stoneNum; i++)
{
if (stoneLoc[i] == x)
{
stepedStNum++;
break;
}
}
if (stepedStNum >= curMin)
{
return curMin;
}
for (i=t; i>=s; i--)
{
curMin = updateMin(x+i, stepedStNum, s, t, l, stoneLoc, stoneNum, curMin);
}
return curMin;
}

5. 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; /* 本步决策遍历时 */
}
}
}
}

6. C语言过河问题,编程!谢谢了,急!

你好,我来为你解答:
解法如下:
1.农夫带羊过去,自己回来
2.农夫带狼过去,带羊回来
3.农夫带白菜过去,自己回来
4.农夫带羊过去
全部安全过岸.

程序暂时没有时间做

7. C语言,农夫过河问题

程序就是求解农夫过河问题:
农夫带着一狼,一羊和一些菜过河。河边只有一船,一次农夫只能带一样东西。无人时,狼要吃羊,羊要吃菜,程序将找出所有农夫过河的方案。

首先要表示狼,羊,菜和农夫所在的位置,4者的位置有本岸和对岸两种情况,分别用0和1表示,4者,所以用一个有4元素的数组。为了要记录每一步,程序中使用了一个二维数组a[MAX_STEP][4],记录每一步4者所在位置。第一步就是a[0],第二布是a[1]...而,a[0][0]就表示第一步狼在本岸(0)还是对岸(1),a[0][1]表示第一步羊在本岸还是对岸......
为了记录每一次农夫过河时的状态,使用了一个数组b[MAX_STEP],数组中的元素的值可能为-1, 0, 1, 2,分别表示农夫在过河时,是空手,带狼,带羊,带菜。

第一步的状态是狼,羊,菜和农夫都在本案,所以a[0][0]到a[0][3]都是0,本来应该初始化一下,但a是全局变量,所以自动初始化为0,所以程序中省下了这一步。
search是一个递归函数,通过不断的查找可能的下一步,找出一个方案,是一种深度优先搜索。
a[iStep][0] + a[iStep][1] + a[iStep][2] + a[iStep][3] == 4意味着第 iStep时,a[iStep][0]到a[iStep][3]都为1,表示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]);
}
}
输出每一步
a[i][3]是农夫在本岸还是对岸,如果为0,在本岸,下一步肯定是到对岸,所以打印"...到对岸",而name[b[i]+1]找出对应带的东西的描述。
for (i = 0; i < iStep; i++)
{
if (memcmp(a[i], a[iStep], sizeof(a[i])) == 0)
{
return;
}
}
判定是否会死循环,如果当前状态在以前出现过,那么就会出现死循环。用当前这步的状态a[iStep]和以前的所有步a[i] (i=0; i <iStep; i++)比较。memcmp是内存比较函数,可以用于比较数组,返回值为0,表示数组中所有值相同。
如果相同,就直接返回,不再查找。

if (a[iStep][1] != a[iStep][3] && (a[iStep][2] == a[iStep][1] || a[iStep][0] == a[iStep][1]))
{
return;
}

判定羊会吃菜,或狼会吃羊的情况。
当农夫和羊在一起的时候,狼不会吃羊,羊也不会吃菜,所以只有当农夫和羊不在一起(a[iStep][1] != a[iStep][3])时,才可能发生“吃”的状态。
而且“吃”的情况必须是在菜和羊在一起(a[iStep][2] == a[iStep][1])或者羊和狼在一起(a[iStep][0] == a[iStep][1])
发生吃的情况是,返回,不再查找。

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);
}
}
但现在,已经确保了上一步是“安全”的,可以继续查找。
-1, 0, 1, 2分别表示渡河时4种情况,空手,带狼,带羊,带菜。
memcpy(a[iStep + 1], a[iStep], sizeof(a[iStep + 1])); 复制当前步的数组到下一步。
农夫的状态肯定会发生改变,所以a[iStep + 1][3] = 1 - a[iStep + 1][3]; 因为当a为0或1时,a = 1 - a会使a在0和1之间切换。
如果i== -1,表示空手,狼,羊,菜的状态都不会发生改变,所以直接搜索下一步(search(iStep + 1); )
否则要被带过去的东西(0, 1, 2分别表示0, 1, 2)的状态需要改变。
要带的东西必须和农夫同在本案或对岸(a[iStep][i] == a[iStep][3]),才可能带得了。只有在这种情况下,使要带的东西的状态和农夫相同(a[iStep + 1][i] = a[iStep + 1][3];),并开始下一步的搜索(search(iStep + 1))。

8. 急!!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
我帮你详细解释再给你流程图啊
虽然时间过了 但希望有用啊

9. c语言过河问题变种

分析:
首先由于正常人和精神病人都有n人,每次乘船的人中必须二者人数相等,否则两岸必有某一边精神病人人数多于正常人,不能正常过河。
其次,若c=1,则必然无法正常过河;又若c<4,船一来一回后,按上述规律,并无人过河,因为过去的人必须同时再把船划回来。
代码如下:
#include <stdio.h>
void main(void)
{
int n,c,pass,i(0);
printf("请输入正常人和精神病人分别的个数n:");
scanf("%d",&n);
printf("请输入小船载人数c:");
scanf("%d",&c);
if(c<2){printf("Error!");return;}
if(n<1){printf("Error!");return;}
if(c<4)
{
if(n==1)printf("\n1.正常人与精神病人各1人过河 完成!");
else{printf("Error!");return;}
}
else
{
pass=c/2;
while(n!=0)
{
if(n>pass)
{
++i;
printf("\n%d.正常人与精神病人各%d人过河",i,pass);
++i;
printf("\n%d.正常人与精神病人各1人回来",i);
n-=(pass-1);
}
else
{
++i;
printf("\n%d.正常人与精神病人各%d人过河 完成!",i,n);
n=0;
}
}
}
}

10. 求C语言高手解答,这是传教士野人过河问题。程序运行总是出现无解死循环,看不出问题,求大神解答!

陷入死循环,说明 在退出循环的语句中出现了问题。不知道你如何定义的栈结构,所以你自己分析下,while((s->top)+1)与if(pd==1) 的判断是不是出错了。。