/*總體思路:用乙個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 南岸 我們怎麼判斷農夫在...