當前位置:首頁 » 編程語言 » C語言過河死課本有嗎
擴展閱讀
em存儲器定址范圍 2022-07-07 21:46:56
數據存儲器和程序 2022-07-07 21:42:18
如何查看硬碟的型號的 2022-07-07 21:42:12

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) 的判斷是不是出錯了。。