⑴ 三個人和三個鬼過河,船隻能做兩個人。鬼如果比人多就吃掉人,必須鬼和人都過去才行,怎麼過
可以有以下的過河方法:
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岸