導航:首頁 > 編程語言 > 過河問題編程

過河問題編程

發布時間:2022-01-14 14:01:01

Ⅰ 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
我幫你詳細解釋再給你流程圖啊
雖然時間過了 但希望有用啊

Ⅵ 農夫,狼,山羊過河問題編程方案,急,謝謝

兩個答案

  1. 先帶山羊過去,再帶白菜過去.把山羊帶回來.狼帶過去,再回來帶山羊。

  2. 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);
}

Ⅹ 編程問題:渡河問題。一個農夫帶著一條狼、一隻山羊和一籃蔬菜過河,

首先把羊運到對岸(因為狼不吃菜),再把狼運到對岸同時把羊帶回來放到岸這邊(有農夫在羊不會吃菜),這一次把菜運到對岸空著回來(理由仍然是狼不吃菜),最後再次把羊運到對岸完成渡河。

閱讀全文

與過河問題編程相關的資料

熱點內容
apacheaddtypephp 瀏覽:499
女程序員美劇 瀏覽:637
安卓怎麼隱身登錄王者榮耀 瀏覽:852
通達信前五源碼編寫 瀏覽:17
gcc怎麼編譯qt程序 瀏覽:925
華為文件夾命名大全 瀏覽:383
php無限分類循環 瀏覽:41
北漂程序員營養餐 瀏覽:105
掃描件pdf轉換成圖片 瀏覽:58
忍者必須死伺服器升級到什麼時候 瀏覽:339
鹼基最多配對演算法 瀏覽:829
命令和決定表彰上的區別 瀏覽:152
全國醫保服務平台app叫什麼 瀏覽:319
php輸出表單 瀏覽:237
西門子r變數編程入門 瀏覽:374
壓縮機器人怎麼做 瀏覽:285
魔獸懷舊服什麼時候來新伺服器 瀏覽:796
如何電腦網路加密 瀏覽:475
終端世界在編譯 瀏覽:771
白色洗碗棉手工解壓 瀏覽:748