八人過河 程式 C

2021-08-09 07:49:50 字數 2151 閱讀 7210

/*總體思路:用乙個9位的整數表示,當前所處的狀態,最高位表示河的左岸或者右岸。

低8位依次表示警察,犯人,父親

母親,2個兒子,2個女兒;一次渡河可以看成是2個狀態之間的轉移。

總體分兩步進行;

step 1:先算出轉移矩陣

step 2:利用迪傑斯特拉算出,源點到終點最短路徑,所經歷的結點。

*/#define max 10000//結點間的最大值,表示兩個狀態不能轉換

#define n 512//表示狀態向量,以9bit值表示。eg:0 1111 1111表示開始狀態,所有的8個人在河的左岸。

const

int lrmask=1

<<8;//0表示在河的左岸,1表示在河的右岸。

const

int cap= 1

<<7;//表示警察的狀態

const

int criminal=1

<<6;//表示犯人的狀態

const

int father=1

<<5;//表示爸爸的狀態

const

int mother=1

<<4;//表示媽媽的狀態

const

int son=3

<<2;//表示兩個兒子的狀態

const

int daughter=3;//表示兩個女兒的狀態

bool is_possible_state(int x)//判斷某個狀態是否滿足規則

bool is_possible_vec(unsigned

char x)//判斷在船上的狀態

if ((x&criminal)&&(!(x&cap))&&(x&(father+mother+son+daughter)))//判斷該狀態是否滿足規則

return

false;

if ((x&father)&&(!(x&mother))&&(x&daughter))

return

false;

if ((x&mother)&&(!(x&father))&&(x&son))

return

false;

else

return

true;//滿足情況,返回true.

} void dijkstra(int v, int **dist,int d[n],int p[n],int s[n])

s[v1]=1;

for( i=0; i1; i++)

}

for(i=511; i<512; i++) //僅輸出從源點狀態0 1111 1111 到終點狀態 1 0000 0000的路徑

printf("

} } int main()

//計算矩陣的值,即計算結點之間的路徑。1表示可以連線,0表示自己與自己路徑,max表示結點間不相連線

for(int i=0;ifor (int j=0;jif (i==j)

matrix[i][j]=0;//自己與自己的距離為0

else

if(((i&lrmask)^(j&lrmask))&&is_possible_state(~j)&&is_possible_state(i)&&is_possible_state(~j)&&is_possible_state(j))

else

matrix[i][j]=max;//表示節點間不相連}}

int d[n]=;//陣列d表示經過了幾個結點

int p[n]=;//陣列p儲存的是從源點到終點經過了那些結點

int s[n]=;//儲存已經找到的結點

int num=0;

dijkstra(255,matrix,d,p,s);//運用迪傑斯特拉演算法,初始狀態從0 1111 1111開始

}

精華帖 八人過河的程式實現

題目 一家六口,乙個爸爸,乙個媽媽,倆兒子,倆女兒,還有乙個警察,乙個壞蛋,過一條河。爸爸不在媽媽傷害兒子,媽媽不在爸爸傷害女兒,警察不在壞蛋傷害一家六口。只有媽媽爸爸警察會開船,一次只能過兩個人,只有一艘船。用程式實現怎麼過河。思路見程式 include include include using...

UPPAAL例子 維京人過河

模板 torch 性質驗證 uppaal 四名維京人將要穿過一座受損的橋夜晚。這座橋當時只能載兩個維京人去 在橋上找到維京人需要帶火炬的路。這個維京人需要5分鐘 10分鐘 20分鐘和25分鐘 單程 才能穿越這座橋。有沒有把四個維京人都送到橋上的時間表?60分鐘內?chan take,release ...

C 農夫過河問題

農夫過河問題 大家有沒有看過我的c學習中的位算,我們用8位二進位制的數字來表示任務的完成與否,1完成 0未完成 現在我們用4個二進位制數來代表 第一位表示農夫 1 北岸,0 南岸 第二位表示狼 1 北岸,0 南岸 第三位表示?1 北岸,0 南岸 第四位表示白菜 1 北岸,0 南岸 我們怎麼判斷農夫在...