人工智慧野人傳教士c
Ⅰ 急!求野人過河問題用c語言實現!!
本來沒打算發出來。送你算了。
下面的程序稱得上perfect,程序在dev-c++下編譯通過.
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define maxloop 100 /* 最大層數,對於不同的擴展方法自動調整取值 */
#define pristnum 3 /*初始化時設定有3個野人3個傳教士,實際可以改動*/
#define slavenum 3
struct SPQ{ int sr,pr; /* 船運行一個來回後河右岸的野人、傳教士的人數 */
int sl,pl; /* 船運行一個來回後河左岸的野人、傳教士的人數 */
int ssr,spr; /* 回來(由左向右時)船上的人數 */
int sst,spt; /* 去時(由右向左時)船上的人數 */
int loop; /* 本結點所在的層數 */
struct SPQ *upnode ,*nextnode;/* 本結點的父結點和同層的下一個結點的地址 */
}spq;
int loopnum;/* 記錄總的擴展次數 */
int openednum;/* 記錄已擴展節點個數 */
int unopenednum;/* 記錄待擴展節點個數 */
int resultnum;
struct SPQ *opened;
struct SPQ *oend;
struct SPQ *unopened;
struct SPQ *uend;
struct SPQ *result;
void initiate();
void releasemem();
void showresult();
void addtoopened(struct SPQ *ntx);
int search();
void goon();
int stretch(struct SPQ* ntx);
void recorder();
int main()
{
int flag; /* 標記擴展是否成功 */
for( ; ; )
{
initiate();
flag = search ();
if(flag == 1)
{
recorder();
releasemem();
showresult();
goon();
}
else
{
printf("無法找到符合條件的解");
releasemem();
goon();
}
}
system("pause");
return 0;
}
void initiate()
{
int x;
char choice;
uend = unopened = (struct SPQ*)malloc(sizeof(spq));
if(uend==NULL)
{
printf("\n內存不夠!\n");
exit(0);
}
unopenednum=1;
openednum=0;
unopened -> upnode = unopened; /* 保存父結點的地址以成鏈表 */
unopened -> nextnode = unopened;
unopened -> sr = slavenum;
unopened -> pr = pristnum;
unopened -> sl = 0;
unopened -> pl = 0;
unopened -> sst = 0;
unopened -> spt = 0;
unopened -> ssr = 0;
unopened -> spr = 0;
unopened -> loop = 0;
printf("題目:設有n個傳教士和m個野人來到河邊,打算乘一隻船從右岸到左岸去。\n");
printf("該船的負載能力為兩人。在任何時候,如果野人人數超過傳教士人數,野人\n");
printf("就會把傳教士吃掉。他們怎樣才能用這條船安全的把所有人都渡過河去?\n");
printf("\n默認的n、m值皆為3\n");
for(;;)
{
printf("\n是否修改?(Y/N)");
scanf("%s",&choice);
choice=toupper(choice);
if(choice=='Y')
{
printf("\n請輸入傳教士人數");
for(;;)
{
scanf("%d",&x);
if(x>0)
{
unopened -> pr = x;
break;
}
else printf("\n輸入值應大於0!\n請重新輸入");
}
printf("\n請輸入野人人數");
for(;;)
{
scanf("%d",&x);
if(x>0)
{
unopened -> sr = x;
break;
}
else printf("\n輸入值應大於0!\n請重新輸入");
}
break;
}
if(choice=='N')break;
}
}
int search()
{
int flag;
struct SPQ *ntx; /* 提供將要擴展的結點的指針 */
for( ; ; )
{
ntx = unopened; /* 從待擴展鏈表中提取最前面的一個 */
if(ntx->loop == maxloop)
return 0;
addtoopened(ntx); /* 將ntx加入已擴展鏈表,並將這個節點從待擴展鏈表中去掉 */
flag = stretch(ntx); /* 對ntx進行擴展,返回-1,0,1 */
if(flag == 1)
return 1;
}
}
int stretch(struct SPQ *ntx)
{
int fsr , fpr ; /* 在右岸上的人數 */
int fsl , fpl ; /* 在左岸上的人數 */
int sst , spt ; /* 出發時在船上的人數 */
int ssr , spr ; /* 返回時船上的人數 */
struct SPQ *newnode;
for (sst = 0 ; sst <= 2 ; sst++) /* 討論不同的可能性並判斷是否符合條件 */
{
fsr = ntx -> sr;
fpr = ntx -> pr;
fsl = ntx -> sl;
fpl = ntx -> pl;
if ((sst <= fsr) && (( 2 - sst) <= fpr))/* 滿足人數限制 */
{
spt = 2 - sst;
fsr = fsr - sst;
fpr = fpr - spt;
if((fpr == 0) && (fsr == 0))/* 搜索成功 */
{
newnode = (struct SPQ*) malloc (sizeof(spq));
if(newnode==NULL)
{
printf("\n內存不夠!\n");
exit(0);
}
newnode -> upnode = ntx; /* 保存父結點的地址以成鏈表 */
newnode -> nextnode = NULL;
newnode -> sr = 0;
newnode -> pr = 0;
newnode -> sl = opened -> sr;
newnode -> pl = opened -> pr;
newnode -> sst = sst;
newnode -> spt = spt;
newnode -> ssr = 0;
newnode -> spr = 0;
newnode -> loop = ntx -> loop + 1;
oend -> nextnode = newnode;
oend = newnode;
openednum++;
return 1;
}
else if ((fpr - fsr) * fpr >= 0) /* 判斷是否滿足傳教士人數必須大於或等於野人人數 */
{
fsl = fsl + sst;
fpl = fpl + spt;
for (ssr = 0 ; ssr <= 1 ; ssr++) /* 返回 */
{
int ffsl , ffpl;
if ((ssr <= fsl) && ((1 - ssr) <= fpl))
{
spr = 1 - ssr;
ffsl = fsl - ssr;
ffpl = fpl - spr;
if ((ffpl - ffsl) * ffpl >= 0)
{ /* 若符合條件則分配內存並付值 */
int ffsr , ffpr;
ffsr = fsr + ssr;
ffpr = fpr + spr;
newnode = (struct SPQ*) malloc (sizeof(spq));
if(newnode==NULL)
{
printf("\n內存不夠!\n");
exit(0);
}
newnode -> upnode = ntx; /* 保存父結點的地址以成鏈表 */
newnode -> sr = ffsr;
newnode -> pr = ffpr;
newnode -> sl = ffsl;
newnode -> pl = ffpl;
newnode -> sst = sst;
newnode -> spt = spt;
newnode -> ssr = ssr;
newnode -> spr = spr;
newnode -> loop = ntx -> loop + 1;
uend -> nextnode = newnode;
uend = newnode;
unopenednum++;
}
}
}
}
}
}
return 0;
}
void addtoopened(struct SPQ *ntx)
{
unopened = unopened -> nextnode;
unopenednum--;
if (openednum == 0 )
oend = opened = ntx;
oend -> nextnode = ntx;
oend = ntx;
openednum++;
}
void recorder()
{
int i , loop;
struct SPQ *newnode;
struct SPQ *ntx;
loop = oend -> loop;
ntx = oend;
resultnum = 0;
for( i = 0 ; i <= loop ; i++ )
{
newnode = (struct SPQ*) malloc (sizeof(spq));
if(newnode==NULL)
{
printf("\n內存不夠!\n");
exit(0);
}
newnode -> sr = ntx -> sr;
newnode -> pr = ntx -> pr;
newnode -> sl = ntx -> sl;
newnode -> pl = ntx -> pl;
newnode -> sst = ntx -> sst;
newnode -> spt = ntx -> spt;
newnode -> ssr = ntx -> ssr;
newnode -> spr = ntx -> spr;
newnode -> nextnode = NULL;
ntx = ntx -> upnode;
if(i == 0)
result = newnode;
newnode -> nextnode = result;
result = newnode;
resultnum++;
}
}
void releasemem()
{
int i;
struct SPQ* nodefree;
for ( i = 1 ; i < openednum ; i++ )
{
nodefree = opened;
opened = opened -> nextnode;
free(nodefree);
}
for ( i = 0 ; i < unopenednum ; i++ )
{
nodefree = unopened;
unopened = unopened -> nextnode;
free(nodefree);
}
}
void showresult()
{
int i;
int fsr , fpr ; /* 在右岸上的人數 */
int fsl , fpl ; /* 在左岸上的人數 */
struct SPQ* nodefree;
printf("%d個傳教士",result -> pr);
printf("%d個野人",result -> sr);
printf("%d個傳教士",result -> pl);
printf("%d個野人",result -> sl);
for ( i = 1 ; i < resultnum ; i++ )
{
nodefree = result;
result = result -> nextnode;
free(nodefree);
printf("\n\n\t左岸人數 船上人數及方向 右岸人數\n");
printf("第%d輪\n",i);
fpl = result -> pl - result -> spt + result -> spr;
fpr = result -> pr - result -> spr;
fsl = result -> sl - result -> sst + result -> ssr;
fsr = result -> sr - result -> ssr;
printf("傳教士%8d%8d\t<-\t%8d\n",fpl,result -> spt,fpr);
printf("野 人%8d%8d\t<-\t%8d\n",fsl,result -> sst,fsr);
printf("傳教士%8d%8d\t->\t%8d\n",result -> pl,result -> spr,result -> pr - result -> spr);
printf("野 人%8d%8d\t->\t%8d\n",result -> sl,result -> ssr,result -> sr - result -> ssr);
}
printf("\n全體傳教士和野人全部到達對岸");
free(result);
}
void goon()
{
char choice;
for(;;)
{
printf("是否繼續?(Y/N)\n");
scanf ("%s" , &choice);
choice=toupper(choice);
if(choice=='Y')break;
if(choice=='N')exit(0);
}
}
Ⅱ 急求 人工智慧 野人傳教士過河問題,詳解!!!!
我來試著回答一下前三問:
(1)完整的規則集合
if(MR,CR,LR=1)then(MR-1,CR,LR-1);
if(MR,CR,LR=1)then(MR,CR-1,LR-1);
if(MR,CR,LR=1)then(MR-1,CR-1,LR-1);
if(MR,CR,LR=1)then(MR-2,CR,LR-1);
if(MR,CR,LR=1)then(MR,CR-2,LR-1);
if(MR,CR,LR=0)then(MR+1,CR,LR+1);
if(MR,CR,LR=0)then(MR,CR+1,LR+1);
if(MR,CR,LR=0)then(MR+1,CR+1,LR+1);
if(MR,CR,LR=0)then(MR+2,CR,LR+1);
if(MR,CR,LR=0)then(MR,CR+2,LR+1);
(2)狀態空間的總狀態數為4×4×2=32,只有20個合法狀態,其中有4個合法狀態達不到,最終解空間由16個狀態組成,下面給出說明
(MR,CR,LR)(MR,CR,LR)
(001)達不到(000)
(011)(010)
(021)(020)
(031)(030)達不到
(101)不合法(100)不合法
(111)(110)
(121)不合法(120)不合法
(131)不合法(130)不合法
(201)不合法(200)不合法
(211)不合法(210)不合法
(221)(220)
(231)不合法(230)不合法
(301)達不到(300)
(311)(310)
(321)(320)
(331)(330)達不到
(3)2個野人去,1個野人回
2個野人去,1個野人回
2個傳教士去,1個野人與1個傳教士回
2個傳教士去,1個野人回
2個野人去,1個野人回
2個野人去,完成
不合法的狀態和重復狀態,我都沒畫出,你可以自己加一下,也可以結合圖
說明一下
Ⅲ 求C語言高手解答,這是傳教士野人過河問題。程序運行總是出現無解死循環,看不出問題,求大神解答!
陷入死循環,說明 在退出循環的語句中出現了問題。不知道你如何定義的棧結構,所以你自己分析下,while((s->top)+1)與if(pd==1) 的判斷是不是出錯了。。
Ⅳ 野人與傳教士
1、先讓兩個野人渡過河,留下一個野人,再讓另一個野人劃船回來,把另一個野人載到右岸,再讓另一個野人劃船回左岸,此時右岸有兩個野人,左岸有三個傳教士一個野人;
2、讓兩個傳教士劃船過河,留下一個傳教士和一個野人,一個傳教士和一個野人劃船回左岸,此時右岸有一個傳教士和一個野人,左岸有兩個野人、兩個傳教士;
3、讓左岸的兩個傳教士劃船到左岸,此時右岸有三個傳教士一個野人,再讓一個野人劃船回左岸將剩下的野人載過來,就可以了。
Ⅳ 一個關與野人與傳教士的C語言題
不可能安全地把所有人都渡過河去,因為安全的方法野人是不會同意的,你也沒辦法和他們講清道理。
假設有個傳教士連哄帶騙讓野人同意要採取的方法,那就好辦
用窮舉的方法,就是亂猜,猜到對為止
先設兩個數組right[]與left[],right放右岸的人,left放左岸的人
再設兩個數LL表示左岸從數,RL表示右岸人數
部分演算法如下:(剩下些很簡單的演算法就不用我說了吧)
從左岸刪除(manNO a,manNO b)
{
if(a!=LL)
從左岸刪除(a);
從左岸刪除(b);
LL--;
}
結果 從右岸選人過河,位置為(manNO a,manNO b)
{
從右岸刪除(a,b);
往左岸加入(a,b);
if(右岸野人多於傳教士 or 左岸野人多於傳教士)
return 反敗;
return 成功;
}
結果 從左崖選人返回,位置為(manNO a,manNO b)
{
從左岸刪除(a,b);
往右岸增加(a,b);
if(右岸野人多於傳教士 or 左岸野人多於傳教士)
return 反敗;
return 成功;
}
結果 過河()
{
選定第1次到第7次過河和返回的人的編號
if(這7次過河與返回結果都成功)
返回成功;
}
上面的 "過河()"函數可能寫得太簡單,下面是詳細的:
typedef int manNO;
manNO h1,h2,H1,H2,i1,i2,I1,I2,j1,j2,J1,J2,k1,k2,K,l1,l2,L1,L2,m1,m2,M1,M2;//全局變數
結果 過河()
{ //h1==RL是特殊情況,表示只選一人:h1不選,只選h2
for(h1=0;h1<RL;h1++)for(h2=(h1+1)%RL;h2<=RL;h2++)for(H1=0;H1<LL;H++)for(H2=(H1+1)%LL;H2<=LL;H2++)
for(i1=0;i1<RL;i1++)for(i2=(i1+1)%RL;i2<=RL;i2++)for(I1=0;I1<LL;I++)for(I2=(I1+1)%LL;I2<=LL;I2++)
for(j1=0;j1<RL;j1++)for(j2=(j1+1)%RL;j2<=RL;j2++)for(J1=0;J1<LL;J++)for(J2=(J1+1)%LL;J2<=LL;J2++)
for(k1=0;k1<RL;k1++)for(k2=(k1+1)%RL;k2<=RL;k2++)for(K1=0;K1<LL;K++)for(K2=(K1+1)%LL;K2<=LL;K2++)
for(l1=0;l1<RL;l1++)for(l2=(l1+1)%RL;l2<=RL;l2++)for(L1=0;L1<LL;L++)for(L2=(L1+1)%LL;J2<=LL;L2++)
for(m1=0;m1<RL;m1++)for(m2=(m1+1)%RL;m2<=RL;m2++)
if(從右岸選人過河,位置為(h1,h2)==成功)if(從左崖選人返回,位置為(H1,H2)==成功)
if(從右岸選人過河,位置為(i1,i2)==成功)if(從左崖選人返回,位置為(I1,I2)==成功)
if(從右岸選人過河,位置為(j1,j2)==成功)if(從左崖選人返回,位置為(J1,J2)==成功)
if(從右岸選人過河,位置為(k1,k2)==成功)if(從左崖選人返回,位置為(K1,K2)==成功)
if(從右岸選人過河,位置為(l1,l2)==成功)if(從左崖選人返回,位置為(L1,L2)==成功)
if(從右岸選人過河,位置為(m1,m2)==成功)
return 成功;
}
Ⅵ 人工智慧 野人與傳教士c++程序,能運行
http://so.csdn.net/bbsSearchResult.aspx?q=%e9%87%8e%e4%ba%ba%e4%b8%8e%e4%bc%a0%e6%95%99%e5%a3%ab%e8%bf%87%e6%b2%b3&p=0
csdn的論壇,自己找,有答案。
Ⅶ c語言傳教士與野人過河程序
你把問題看簡單了。你的程序有幾個問題:
intboatf(intim,intic,intii)在這個函數中改變的im和ic的值只是改變的兩個臨時變數的值,並沒有改變全局變數im和ic的值。你可以把前兩個參數去掉。
還有,你的for循環並不是可以正確遍歷所有情況的。
我寫了一個程序,tc2.0通過了。在執行到第145種方案時成功。
程序中case的幾個順序請不要任意改動,因為ltor和rtol函數中他們有對應關系。
本題目一共有5的13次方種方案,我的演算法能排除很多非法方案。當然,我的演算法不是最好的,希望高手能提供更高效的演算法。
做這個程序累壞了我幾萬個腦細胞,樓主給多加點分吧!謝謝了!
#include<stdio.h>
/*定義N為所用步數,先定為6步*/
#defineN6
/*分別為左岸和右岸的im,ic數*/
intiml,imr,icl,icr;
/*定義sn為左右岸的移動的每一步*/
intsn[N+N-1]={0};
voidltor(inti)
/*lefttoright*/
{
switch(i){
case0:
iml--;
icl--;
printf("%dim%dic|im+ic-->|%dim%dic ",iml,icl,imr,icr);
imr++;
icr++;
break;
case1:
iml-=2;
printf("%dim%dic|im+im-->|%dim%dic ",iml,icl,imr,icr);
imr+=2;
break;
case2:
icl-=2;
printf("%dim%dic|ic+ic-->|%dim%dic ",iml,icl,imr,icr);
icr+=2;
break;
case3:
iml--;
printf("%dim%dic|im-->|%dim%dic ",iml,icl,imr,icr);
imr++;
break;
case4:
icl--;
printf("%dim%dic|ic-->|%dim%dic ",iml,icl,imr,icr);
icr++;
break;
default:
printf("error ");
}
}
voidrtol(inti)
/*righttoleft*/
{
switch(i){
case0:
imr--;
icr--;
printf("%dim%dic|<--im+ic|%dim%dic ",iml,icl,imr,icr);
iml++;
icl++;
break;
case1:
imr-=2;
printf("%dim%dic|<--im+im|%dim%dic ",iml,icl,imr,icr);
iml+=2;
break;
case2:
icr-=2;
printf("%dim%dic|<--ic+ic|%dim%dic ",iml,icl,imr,icr);
icl+=2;
break;
case3:
imr--;
printf("%dim%dic|<--im|%dim%dic ",iml,icl,imr,icr);
iml++;
break;
case4:
icr--;
printf("%dim%dic|<--ic|%dim%dic ",iml,icl,imr,icr);
icl++;
break;
default:
printf("error ");
}
}
intset(intk)
/*setsn[i]*/
{
inti;
for(i=k+1;i<N+N-1;i++)
/*k位之後的sn元素都賦值為零*/
sn[i]=0;
sn[k]++;
/*k位元素自加1*/
for(i=k;i>0;i--)
/*每位元素超過4則置零,並向前一位進一*/
{
if(sn[i]>4){
sn[i]=0;
sn[i-1]++;
}elsebreak;
}
if(sn[0]>5)
/*sn遍歷一遍則返回0,否則返回1*/
return0;
elsereturn1;
}
voidrestart(void)
/*restartthework*/
{
imr=icr=0;
iml=icl=3;
}
voidmain(){
inti,
step,
found=0;
unsignedlongn=0;
/*TheNUMoftheplans*/
do{
i=0;
step=N-1;
n++;
restart();
ltor(sn[i]);
while((step--)||!(iml==0&&icl==0)){
i++;
rtol(sn[i]);
if(sn[i]==sn[i-1]){
printf("The%ldthplantoRisnotperfect! ",n);
break;
}
if((imr>0&&imr<icr)||imr<0||icr<0||(iml>0&&iml<icl)||iml<0||icl<0){
printf("The%ldthplantoRisfail! ",n);
break;
}
i++;
ltor(sn[i]);
if(sn[i]==sn[i-1]){
printf("The%ldthplantoRisnotperfect! ",n);
break;
}
if((imr>0&&imr<icr)||imr<0||icr<0||(iml>0&&iml<icl)||iml<0||icl<0){
printf("The%ldthplantoRisfail! ",n);
break;
}
}
if(iml==0&&icl==0){
printf("! ");
getchar();
break;
}
}while(set(i));
}
Ⅷ c語言:我編的傳教士與野人過河程序
程序過程是沒問題的,只是在函數內聲明的局部變數與全局變數同名,造成在函數內全局變數不起作用,
在函數
int
boatf(int
im,int
ic,int
ii)
中,由於形參局部變數與全局變數同名,實際在該函數中起作用的只是局部變數,再加上函數里沒有把局部變數運算後的值賦給全局變數,所以函數運行結束後,全局變數的值與函數運行前的值一樣.在整個程序運行過程中,main
函數中的im
,ic的值始終都是3,結果就是一種死循環狀態.
答案補充
不過我不清楚你設計從
"右岸到左岸用boatr"
的函數作用是什麼.
Ⅸ 人工智慧用啟發式搜索解決傳教士-野人(M-C)問題!環境:matlab/Vc 要可運行程序 謝謝!
問題:
有3個傳教士和3個野人要過河,只有一艘船,這艘船每次只能載2個人過河,且無論哪邊野人的數量大於傳教士的數量時,野人就會吃掉傳教士。怎樣讓他們都安全過河?
C語言源代碼:
#include <stdio.h>
#include <string.h>
#define STEP_MAX 20 //來回過河的次數
#define KIND_NUM 3 //每個種類的數量
#define BOAT_NUM 2 //船的載重量
typedef enum
{
BOAT_THIS,//船在本岸
BOAT_THAT,//船在對岸
} boat_t;
typedef enum
{
ROAD_GO,//過河
ROAD_COME,//回來
} road_t;
typedef struct
{
int ye;//對岸野人數量
int man;//對岸傳教士數量
boat_t boat;//船是否在對岸
} state_t;//一種局面
typedef struct
{
int ye;//野人過河數量
int man;//傳教士過河的數量
road_t road;//回來或過河
} step_t;//一個步驟
state_t states[STEP_MAX]={0};
step_t steps[STEP_MAX]={0};
//判斷所有的野人和傳教士是否都到了對岸
bool final(state_t s)
{
const state_t cs=
{
KIND_NUM,
KIND_NUM,
BOAT_THAT
};
if(memcmp(&cs,&s,sizeof(state_t))==0)
{
return true;
}
return false;
}
//是否會發生野人殺傳教士
bool bad(state_t s)
{
if(((KIND_NUM-s.ye)>(KIND_NUM-s.man) && (KIND_NUM-s.man)>0)
||(s.ye>s.man && s.man>0))
{
return true;
}
return false;
}
//第n種局面是否跟前面的相重復
bool repeat(state_t s[],int n)
{
int i;
for (i = 0; i < n; i++)
{//已經有這種情況了
if (memcmp(&states[i], &states[n], sizeof(states[i])) == 0)
{
return true;
}
}
return false;
}
void output(step_t steps[STEP_MAX],int n)
{
char *kinds[KIND_NUM]={"野人","傳教士"};
char *routine[2]={"過河.","回來."};
int i;
for (i = 0; i < n; i++)
{
if((steps[i].ye * steps[i].man)>0)
{
printf("%d個%s和%d個%s%s\n",steps[i].ye,kinds[0],
steps[i].man,kinds[1],routine[steps[i].road]);
}
else if(steps[i].ye>0)
{
printf("%d個%s%s\n",steps[i].ye,kinds[0],
routine[steps[i].road]);
}
else if(steps[i].man>0)
{
printf("%d個%s%s\n",steps[i].man,kinds[1],
routine[steps[i].road]);
}
}
printf("\n");
}
//搜索過河方案(n表示過河次數)
void search(int n)
{
int i,j;
if(n>STEP_MAX)
{//步數限制太少了
printf("Step Overflow!");
return;
}
if(final(states[n]))
{//都到對岸了
output(steps,n);
return;
}
if(bad(states[n]))
{//發生了野人殺傳教士了
return;
}
if(repeat(states,n))
{//與前面的局面相重復了
return;
}
if(states[n].boat==BOAT_THIS)
{//船在本岸
for (i = 0; i <= BOAT_NUM && i<=(KIND_NUM-states[n].ye); i++)
for (j = 0; j <= BOAT_NUM-i && j<=(KIND_NUM-states[n].man); j++)
{
if(i==0 &&j==0)
{
continue;
}
steps[n].ye=i;
steps[n].man=j;
steps[n].road=ROAD_GO;
memcpy(&states[n+1], &states[n], sizeof(state_t));
states[n+1].ye+=i;
states[n+1].man+=j;
states[n+1].boat=BOAT_THAT;
search(n+1);
}
}
else
{
for (i = 0; i <= BOAT_NUM && i<=states[n].ye; i++)
for (j = 0; j <= BOAT_NUM-i && j<=states[n].man; j++)
{
if(i==0 &&j==0)
{
continue;
}
steps[n].ye=i;
steps[n].man=j;
steps[n].road=ROAD_COME;
memcpy(&states[n+1], &states[n], sizeof(state_t));
states[n+1].ye-=i;
states[n+1].man-=j;
states[n+1].boat=BOAT_THIS;
search(n+1);
}
}
}
int main()
{
search(0);
return 0;
}
Ⅹ 人工智慧野人傳教士過河
第一次倆個野人過來河,留下一個源野人,回一個野人
第二次一野人一傳教士過河,留下一個傳教士,回一個野人
第三次倆個教士過河,回一個野人
剩下的就好辦了...
(錯)
*************************************************************************
汗。。。火星微生物說得對哈,我差點就鬧出人命了
試一試:(x:野人,o:傳教士)
第一次倆個野人過河,留下一個野人,回一個野人( xxooo|x )
第二次倆個野人過河,留下一個野人,回一個野人(xooo|xx)
第三次倆個傳教士過河,回一個野人,一傳教士(xxoo|xo)
第四次倆個傳教士過河(xx|xooo)........
大家看看,有沒有問題(這幾天腦袋發昏),歡迎指教:)