⑴ 三个人和三个鬼过河,船只能做两个人。鬼如果比人多就吃掉人,必须鬼和人都过去才行,怎么过
可以有以下的过河方法:
1、1个人跟1个鬼先过河,然后鬼上对岸,人把船划回去。
原岸2人2鬼,对岸1鬼。
2、划船回去的1人上岸,2鬼上船划到对岸,1鬼上对岸,1鬼划船回去。
原岸3人,对岸2鬼。
3、划船回去的1鬼上岸,2人下船划到对岸,到对岸后,2人上岸,让1人1鬼把船划回去。
原岸1人1鬼,对岸1人1鬼。
4、划船回去后1鬼上岸,1人下船,然后船上共2人划去对岸。2人都上岸,让鬼下船划去对岸。
原岸2鬼,对岸3人。
5、最后就是让鬼自己把鬼都运过来就OK了。行船前后过程中,人鬼的数均衡,没有出现鬼大于人的情况。
⑵ 有C语言实现野人过河问题
此题的条件没有说明充分,是无法解题的。
现补充完整已知条件:M>N>c
也就是说,现在的牧人比野人多。c个野人过去,一个野人回来,然后c个牧人过去,再1个牧人过来.现在目的地牧人和野人各为c-1个人(安全),始发地也安全。
然后,牧人和野人各为1/2c的数量出发,一个牧人和一个野人同时回来。
直到始发地牧人或野人人数少于c。牧人划船过去,一个野人回来,剩下的野人都过去。
⑶ C语言过河问题,编程!谢谢了,急!
你好,我来为你解答:
解法如下:
1.农夫带羊过去,自己回来
2.农夫带狼过去,带羊回来
3.农夫带白菜过去,自己回来
4.农夫带羊过去
全部安全过岸.
程序暂时没有时间做
⑷ 将逻辑问题,使用编程C语言进行描述,保证其算法的正确性,可运行。能得出全部符合题目的正确结果。
这是一道逻辑性的问题 上面那位没有考虑只有大人会划船 首先管家和狗要先过去 然后爸爸和妈妈过去 然后妈妈再回去接弟弟 然后爸爸回去接妹妹 我只能跟你分析到这里 因为你这道题是错题 我一开始就知道 但我还是想了很久 虽然我很聪明 但错题还是吃不住 有什么问题还可以继续问我 希望采纳
⑸ C语言问题 20分
#include <stdio.h>
#include <stdlib.h>
int n,w;
int person[30000];
int cmp_int(const void* in1,const void *in2){
return *(int*)in1 - *(int*)in2;
}
int main(){
FILE *fi=fopen("kaj.in","r");
int i,j,w2,r;//r是计算结果
fscanf(fi,"%d%d",&w,&n);
for(i=0;i<n;i++){
fscanf(fi,"%d",&person[i]);
}
fclose(fi);
//从小到大排序
qsort(person,n,sizeof(int),cmp_int);
w2=w/2;
//考虑那些超过w/2重的人
for(i=0,j=n-1,r=0; i<j && person[j]>=w2; j--,r++){
if(person[i]+person[j]<=w)//重的可以和轻的搭一条船
i++;
//else{}重的单独一条船
}
//其余都是小于w/2的人,一定能2人一船
if(i<=j){
r+=(j-i)/2+1;//此时剩余人数(j-i+1),需要船((j-i+1)+1)/2
}
fi=fopen("kaj.out","w");
fprintf(fi,"%d\n",r);
fclose(fi);
return 0;
}
⑹ 过河问题
你这个问题看着小,其实很大的。人工智能问题~我大概写了一个,不过不能改变小船载客数,你看看合不合你的要求吧。邮箱给我我发给你。
刚才叫哥们叫错了,原来你是女滴~
⑺ 谁有高IQ过河求解算法C语言源码例子啊
有一个猎人和一只狼,爸爸,妈妈两个儿子和两个女儿要过河.
只有猎人,爸爸,妈妈会划船.
船每次只能载两个人.
如果猎人不在,狼会吃掉小孩.如果爸爸不在,妈妈会打儿子,如果妈妈不在,爸爸会打女儿.
问:他们八个(狼也算一个人)如何才能安全渡过河??
:
:
答案:
注;括号表示已过河的人
1.狼和猎人去,猎人回(狼)
2.猎人和甲女儿去,猎人和狼回(甲女儿)
3.妈和乙女儿去,妈回(甲乙女儿)
4.妈和爸去,爸回(妈,甲乙女儿)
5.猎人和狼去,妈回(狼,猎人,甲乙女儿)
6.妈和爸去,爸回(猎人,狼,甲乙女儿,妈)
7.爸和甲儿子去,爸和妈回(猎人,狼,甲乙女儿,甲儿子)
8.爸和乙儿子去,爸回(猎人,狼,甲乙女儿,甲乙儿子)
9.爸和妈去,(全部成功渡河)
⑻ 用C语言做以下的编辑题!!!
三题目类型实际是一样的,都可以总结成一个总数,按规则分指定份,如何分。
题目1:总数135,按规则,分成3份。(规则:二班比一班多5人,三班比二班少7人)
题目2:总数10,按规则,分成2份。(规则:见代码备注,可行方案多个,有且只有一条船可能不满)
题目3:总数60,按规则,分成2份。(规则:见代码备注,可行方案多个,有且只有一个瓶子可能不满)
代码思路,先创建数组,总量平分,多余的放在最后一个元素中。然后不断循环比较规则,按照比较结果各元素不断自增自减,直到完成周期。列举所有可能。
由于本题初始平分后总量均大于实际总量,所以循环是不断做减容比较。
理论适应其他数值,如果初始平分后总量均小于实际总量,代码中循环会不断增容比较,我没有对这种情况做识别,但不影响运行。有兴趣自己改。
增容,减容,以交换差值为数值,比如大船换小船,总容量就-2,反之+2
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
typedefint(*pv)(int*,int);//规则函数指针
voidmeError(void*p);
intde(int*nums,intn,intlen);//数值平分给数组元素,返回余数
int*js(intzn,intgn,pvgz);//zn:总数,gn:分组个数,gz:规则函数,返回值:包含每个分组的最终分配数值的数组
intfbGZ(int*nums,int);//第一题分班规则检查函数。参数1:当前分配的数组。返回值:满足规则返回1,不满足返回0
intfcGZ(int*nums,int);//第二题分船规则检查函数。数组元素1表示大船,元素2表示小船
intfpGZ(int*nums,int);//第三题分瓶规则检查函数。数组元素1表示大瓶,元素2表示小瓶
voidprAsStr(int*nums,intlen);//打印数字数组
intmain()
{
printf("3个班共135人,二班比一班多5人,三班比二班少7人,最终分配方案三班人数分别:
");
prAsStr(js(135,3,fbGZ),3);
printf("41名同学划船,共租10条船.大船坐6人,小船坐4人,问大、小船各租条数分别:
");
js(10,2,fcGZ);
printf("
");
printf("100千克油装了共60个瓶子,大油瓶容量4千克,小油瓶2瓶装1千克.大、小油瓶分别:
");
js(60,2,fpGZ);
return0;
}
intfpGZ(int*nums,intlen)
{
//大油瓶一瓶装4千克,小油瓶2瓶装1千克.现有100千克油装了共60个瓶子.问大、小油瓶
intflag;
floatz=100,bp=4,sp=0.5;//总油量,大瓶容量,小瓶容量,作为规则常量
floatsum=0,sz=0;
if((len!=2)&&printf("错误!:该规则不适用!
"))
return0;
//大瓶换小瓶,容量-3.5,小瓶换大瓶人数+3.5,只有一个瓶子可能不满
//不满值范围(sum-z>0):0<=sum-z<bp,其中0<sum-z<sp范围大瓶小瓶任意一艘不满。sp<=sum-z<bp范围只能是大瓶不满
sum=nums[0]*bp+nums[1]*sp;
if(sum-z>0)
flag=1;
elseif(sum-z<0)
flag=0;
while(1)
{
sum=nums[0]*bp+nums[1]*sp;
sz=sum-z;
if(!sz)
printf("大瓶%d,小瓶%d
",nums[0],nums[1]);
if(sz>=sp&&sz<bp)
printf("大瓶%d,小瓶%d,一艘大瓶未满,还空%0.1fkg的容积
",nums[0],nums[1],sz);
if(sz>0&&sz<sp)
printf("大瓶%d,小瓶%d,一艘小瓶或大瓶未满,还空%0.1fkg的容积
",nums[0],nums[1],sz);
if(sz>0)
nums[0]--,nums[1]++;
else
nums[0]++,nums[1]--;
if(sum-z==0||(sum-z>0&&flag==0)||(sum-z<0&&flag==1))//大小船数量翻转,结束循环
break;
}
return1;
}
intfcGZ(int*nums,intlen)
{
intz=41,bp=6,sp=4,flag=0;//总人数,大船载数,小船载数,作为规则常量
intsum=0,sz=0;
if((len!=2)&&printf("错误!:该规则不适用!
"))
return0;
//大船换小船,人数-2,小船换大船人数+2,只有一条船可能不满。
//不满值范围(sum-z>0):0<=sum-z<bp,其中0<sum-z<sp范围大船小船任意一艘不满。sp<=sum-z<bp范围只能是大船不满
sum=nums[0]*bp+nums[1]*sp;
if(sum-z>0)
flag=1;
elseif(sum-z<0)
flag=0;
while(1)
{
sum=nums[0]*bp+nums[1]*sp;
sz=sum-z;
if(!sz)
printf("大船%d,小船%d
",nums[0],nums[1]);
if(sz>=sp&&sz<bp)
printf("大船%d,小船%d,一艘大船未满,还空%d人位置
",nums[0],nums[1],sz);
if(sz>0&&sz<sp)
printf("大船%d,小船%d,一艘小船或大船未满,还空%d人位置
",nums[0],nums[1],sz);
if(sz>0)
nums[0]--,nums[1]++;
else
nums[0]++,nums[1]--;
if(sum-z==0||(sum-z>0&&flag==0)||(sum-z<0&&flag==1))//大小船数量翻转,结束循环
break;
}
return1;
}
intfbGZ(int*nums,intlen)
{
intcn=0;//cn数值重分配过程中的公共池,重分配成功该必须为0
if(len!=3&&printf("错误!:该规则不适用!
"))
return0;
while(1)
{
if(nums[1]-nums[0]==5&&nums[1]-nums[2]==7&&cn==0)
break;
while(nums[1]-nums[0]<5)
nums[1]++,nums[2]++,cn-=2;
while(nums[1]-nums[0]>5)
nums[1]--,nums[2]--,cn+=2;
while(nums[1]-nums[2]<7)
nums[1]++,nums[0]++,cn-=2;
while(nums[1]-nums[2]>7)
nums[1]--,nums[0]--,cn+=2;
cn=de(nums,cn,len);
nums[len-1]+=cn;//不能均分,余数给最后一个元素,继续循环分配
}
return1;
}
voidprAsStr(int*nums,intlen)
{
inti;
for(i=0;i<len;i++)
printf("%d",nums[i]);
printf("
");
}
intde(int*nums,intn,intlen)//数值平分给数组元素(数组必须有初值,累加),返回余数
{
inti,c=n/len,y=n%len;
for(i=0;i<len;i++)
nums[i]+=c;
returny;
}
int*js(intzn,intgn,pvgz)//zn:总数,gn:分组个数,nums:数组,gz:规则函数,返回值:包含每个分组的最终分配数值的数组
{
inti;
int*nums=(int*)malloc(sizeof(int)*gn);
meError(nums);
for(i=0;i<gn;i++)
nums[i]=0;
nums[gn-1]+=de(nums,zn,gn);//数组初值放平均值,平分后多余值给最后一个元素
gz(nums,gn);
returnnums;
}
voidmeError(void*p)
{
if(p==NULL)
{
printf("异常:内存申请失败!回车结束程序!
");
while(getch()!='
');
exit(0);
}
}
⑼ 过河问题用C++/C语言实现且用MFC实现可视化窗口
给你提供算法,代码没有时间写
假设从A岸到B岸
1、仆人+狗 过河 仆人回 B岸剩 狗
2、仆人+女儿(儿子)过河 女儿(儿子)回 B岸剩 仆人+狗
3、女儿+儿子 过河 回其中之一 B岸剩 一个小孩+ 仆人+狗
4、父+母 过河 B岸的小孩回 剩 父+母+仆人+狗
5、儿子+女儿过河 全部到达B岸