當前位置:首頁 » 編程語言 » 過河c語言

過河c語言

發布時間: 2023-03-19 20:33:02

1. 求狼羊白菜過河的c語言編程題詳解。希望不要用數組解決。

按照你的要求,不使用數組。

我的思路,起點貨物狼、羊、白菜,人一直在開船,通過遞歸函數,每次靠岸嘗試裝卸貨方案,直到找滿足條件的方案。將可行方案存放在結構鏈表中形成操作流水列印。

人狼羊菜存儲方式模擬4位2進制,用1111表示,每位表示一個單位,1存在,0不存在。

#include<stdio.h>
#include<malloc.h>
typedefenum{false,true}bool;
typedefstructopRecord//用結構鏈表記錄操作流水
{
intp1_take;//p1載貨值
intp1_goAd;//p1卸貨值
intp2_take;//p2載貨值
intp2_goAd;//p2卸貨值
intcen;//遞歸層號
structopRecord*next;
}OPR;
OPR*oprHead;
OPR*oprTail;
char*getName(intb);//獲取對應名稱
intbeEaten(intp1,intp2);//檢查是否發生被吃事件,發生返回1,未發生返回0
inttoShip(int*p1,int*p2,int*ship,boolf);//遞歸函數:上船人及任意一組合,返回狀態,1:方案可行;0:方案不可行
intgetFist(intpn);//獲取物品組合中第一個
voidaddLog(intp1_take,intp1_goAd,intp2_take,intp2_goAd,intcen);//將有效操作添加進日誌,cen相同,將視為修改覆蓋
voidprintfLog();//列印操作流水
OPR*findLogBycen(intcen);//通過cen查找流水。有返回節點指針。無返回NULL

intcount=1;
intflag=0;//標識變數=1成立;=0不成立
intcen=0;
intmain()
{
intp1=111,ship=1000,p2=0000;//p1,p2分別表示兩岸,4位數每一位分別表示人狼羊菜,位數值1表示存在,0表示不存在
oprHead=(OPR*)malloc(sizeof(OPR));
oprHead->next=NULL;
oprTail=NULL;
printf("河岸有人、狼、羊、白菜要過河,船每次載人及一物,為避免人上船後狼吃羊或羊吃菜 開始生成方案: ");
if(toShip(&p1,&p2,&ship,0))
{
printf(" 開始生成結果報告: ");
printfLog();
}
else
printf("無可行方案!! ");
return0;
}
voidaddLog(intp1_take,intp1_goAd,intp2_take,intp2_goAd,intcen)//將有效操作添加進日誌,cen相同,將視為修改覆蓋,
{
OPR*oprNew=findLogBycen(cen);
if(oprNew==NULL)//通過查找。確認無記錄,新增記錄
{
oprNew=(OPR*)malloc(sizeof(OPR));
oprNew->p1_take=p1_take;
oprNew->p1_goAd=p1_goAd;
oprNew->p2_take=p2_take;
oprNew->p2_goAd=p2_goAd;
oprNew->cen=cen;
oprNew->next=NULL;
if(oprHead->next==NULL)
oprHead->next=oprNew;
else
oprTail->next=oprNew;
oprTail=oprNew;
}
else//查找發現已有記錄,修改
{
oprNew->p1_take=p1_take;
oprNew->p1_goAd=p1_goAd;
oprNew->p2_take=p2_take;
oprNew->p2_goAd=p2_goAd;
}
}
OPR*findLogBycen(intcen)//通過cen查找流水。有返回節點指針。無返回NULL
{
OPR*headSave=oprHead;
while(headSave->next!=NULL)
{
if(headSave->next->cen==cen)
returnheadSave->next;
headSave=headSave->next;
}
returnNULL;
}
voidprintfLog()//列印操作流水
{
OPR*headSave=oprHead;
intp1_take,p1_goAd,p2_take,p2_goAd,cen,p1TOp2,p2TOp1;
while(headSave->next!=NULL)
{
p1_take=headSave->next->p1_take;
p1_goAd=headSave->next->p1_goAd;
p2_take=headSave->next->p2_take;
p2_goAd=headSave->next->p2_goAd;
cen=headSave->next->cen;
if(p1_take>0||p1_goAd>0)
p1TOp2=1;
else
p1TOp2=0;
if(p2_take>0||p2_goAd>0)
p2TOp1=1;
else
p2TOp1=0;
printf("操作流水%2d:",cen);
printf("%s%s",p1TOp2>0?"從p1":"",p2TOp1>0?"從p2":"");
printf("%s%s",p1_goAd>0?getName(p1_goAd):"",p1_goAd>0?"下船":"");
printf("%s%s",p1_take>0?getName(p1_take):"",p1_take>0?"上船":"");
printf("%s%s",p2_goAd>0?getName(p2_goAd):"",p2_goAd>0?"下船":"");
printf("%s%s",p2_take>0?getName(p2_take):"",p2_take>0?"上船":"");

if(headSave->next->next!=NULL)
printf("。之後行駛方向:%s%s ",p1TOp2>0?"p1->p2":"",p2TOp1>0?"p1<-p2":"");
else
printf(" ");
headSave=headSave->next;
}
}
char*getName(intb)//獲取對應名稱
{
if(b==1000)
return"人";
elseif(b==100)
return"狼";
elseif(b==10)
return"羊";
elseif(b==1)
return"菜";
return"";
}
inttoShip(int*p1,int*p2,int*ship,boolf)//遞歸函數:上船人及任意一組合;lastTake:上一次承載物體,首次調用傳0;f=0:p1->p2方向;1:反向。返回狀態,1:方案可行;0:方案不可行;
{
inttake=-1,goAd,gdflag=1,cenSave;//take:上船物體。goAd:下船物體。gdflag:標識變數,p2判斷能否直接下船,1能0不能
cenSave=++cen;
while(1)
{
goAd=*ship-1000;
if(f==0)//准備p1往p2
{
if(take==-1)
take=getFist(*p1);
*p1-=take;
*p1+=goAd;
gdflag=1;//標識置1,等到p2首先嘗試直接卸貨
}
else//准備p2往p1
{
if(take==-1&&gdflag==0)
{
take=getFist(*p2);
printf("開始嘗試替換貨物: ");
}
if(gdflag==1)//如果p2可以直接卸貨
*p2+=goAd;
else//如果不能直接卸貨,嘗試帶走一個同時卸貨
{
*p2-=take;
*p2+=goAd;
}
}
printf("遞歸層級%d:假設%s從%s上船。%s下船,%s方向行駛。 ",cenSave,take>0?getName(take):"無貨物",f==0?"p1":"p2",goAd!=0?getName(goAd):"無貨物",f==0?"p1往p2":"p2往p1");

if(beEaten(*p1,*p2))//如果發生被吃,假設失敗,還原數據,選擇下一假設
{
if(f==0)
{
*p1+=take;
*p1-=goAd;
}
else
{
if(gdflag==1)//p2點確定不能直接卸貨,還原數據,標識置0
{
printf("----不能直接卸貨,貨物%s回到船上。",getName(goAd));
*p2-=goAd;
gdflag=0;
continue;
}
else//不能直接卸貨並嘗試替換貨物失敗,選擇下一個貨物替換
{
*p2+=take;
*p2-=goAd;
}
}
if(take==1)
{
printf("本次靠岸無可行的裝卸方案,返回層級%d! ",cenSave-1);
return0;
}
take=take/10;//嘗試選擇下一個貨物
continue;
}
else
{

if(f==1&&gdflag==1)//p2直接卸貨假設成立船清空
*ship=1000;
else
*ship=1000+take;//換貨假設成立貨物裝船
if(*p1==0)//如果已經完全轉移
{
printf("所有貨物過河成功!! ");
return1;
}
if(f==0)
addLog(take,goAd,0,0,cenSave);//生成流水日誌
else
addLog(0,0,take,goAd,cenSave);//生成流水日誌
if(toShip(p1,p2,ship,f==0?1:0))
{
return1;
}
else//由於下級失敗,本回合重新選擇
{
gdflag=0;
continue;
}
}
}
}
intgetFist(intpn)//獲取物品組合中第一個
{
inti,count=0;
while(1)//上船物體從岸上第一個物體開始選擇
{
if(pn<=1)
break;
pn=pn/10;
count++;
}
for(i=0;i<count;i++)
pn=pn*10;
returnpn;
}
intbeEaten(intp1,intp2)//檢查是否發生被吃事件,發生返回1,未發生返回0
{
intren=0;
if(p1==110&&++ren==1)
printf("----河岸p1狼把羊吃了!重新選擇 ");
if(p2==110&&++ren==1)
printf("----河岸p2狼把羊吃了!重新選擇 ");
if(p1==11&&++ren==1)
printf("----河岸p1羊把菜吃了!重新選擇 ");
if(p2==11&&++ren==1)
printf("----河岸p2羊把菜吃了!重新選擇 ");
returnren;
}

2. 求:C語言課設游戲青蛙過河源代碼!

設n為石墩數,m為荷葉數 ,設F[n,m]表示當有n個石墩,m個荷葉時,能跳過去的最多青蛙數,我們現在可以增加一個石墩,此時就有n+1個石墩了,把第n+1個石墩看成右岸,這樣就可以把F[n,m]個青蛙從左岸跳到第n+1個石墩上(藉助原來河裡的n個石墩,m個荷葉), 這時第n+1個石墩上就有F[n,m]個青蛙了,此時河裡還有n個空石墩,m個空荷葉,還可以幫助F[n,m]個青蛙從左岸跳到真正的右岸,此時再把第n+1個石墩看成左岸, 藉助河裡的n個石墩,m個荷葉,順利的跳到右岸青蛙的身上.至此一共可以跳過去 2*F[n,m]個青蛙.
由此可知: 關系式 F[n+1,m]=2*F[n,m]

推導: F[n,m]=2*F[n-1,m]
=4*F[n-2,m]
……
=(2^i)*F[n-i,m]
……
=(2^n)*F[0,m]
當n=0時,河裡只有m個荷葉,每個葉上只能有一個青蛙,再加上從右岸可以直接跳到左岸的一隻,所以共有m+1個青蛙,即F[0,m]=m+1;所以
F[n,m]=(m+1)*2^n

3. 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;
}

4. C語言代碼 過河智力游戲

#include <stdio.h>#define MAX 100typedef enum BOOL{ FALSE = 0, TRUE = 1 }BOOL。

typedef union Items{struct {char boy : 1;char girl : 1;char boys)。

語言特點

主要特點

C語言是一種結構化語言,它有著清晰的層次,可按照模塊的方式對程序進行編寫,十分有利於程序的調試,且c語言的處理和表現能力都非常的強大,依靠非常全面的運算符和多樣的數據類型,可以輕易完成各種數據結構的構建。

通過指針類型更可對內存直接定址以及對硬體進行直接操作,因此既能夠用於開發系統程序,也可用於開發應用軟體。通過對C語言進行研究分析,總結出其主要特點如下:

(1)簡潔的語言

C語言包含的各種控制語句僅有9種,關鍵字也只有32個,程序的編寫要求不嚴格且以小寫字母為主,對許多不必要的部分進行了精簡。

實際上,語句構成與硬體有關聯的較少,且C語言本身不提供與硬體相關的輸入輸出、文件管理等功能,如需此類功能,需要通過配合編譯系統所支持的各類庫進行編程,故c語言擁有非常簡潔的編譯系統。

(2)具有結構化的控制語句

C語言是一種結構化的語言,提供的控制語句具有結構化特徵,如for語句、if...else語句和switch語句等。可以用於實現函數的邏輯控制,方便麵向過程的程序設計。

(3)豐富的數據類型

C語言包含的數據類型廣泛,不僅包含有傳統的字元型、整型、浮點型、數組類型等數據類型,還具有其他編程語言所不具備的數據類型,其中以指針類型數據使用最為靈活,可以通過編程對各種數據結構進行計算。

以上內容參考:網路-C語音

熱點內容
燕山大學編譯原理期末考試題 發布:2024-11-05 20:13:54 瀏覽:523
華為電腦出現臨時伺服器 發布:2024-11-05 20:05:08 瀏覽:405
斗戰神免費挖礦腳本 發布:2024-11-05 19:53:25 瀏覽:662
網吧伺服器分別是什麼 發布:2024-11-05 19:45:32 瀏覽:389
忍3無傷腳本 發布:2024-11-05 19:11:40 瀏覽:302
江蘇雲伺服器散熱器定製 發布:2024-11-05 18:50:15 瀏覽:719
投資分紅網站源碼 發布:2024-11-05 18:36:38 瀏覽:503
我的世界推薦適合萌新的伺服器 發布:2024-11-05 18:30:03 瀏覽:578
c語言考級 發布:2024-11-05 18:16:54 瀏覽:505
易語言不能編譯安卓app嗎 發布:2024-11-05 18:14:11 瀏覽:836