題目:
一家六口,乙個爸爸,乙個媽媽,倆兒子,倆女兒,還有乙個警察,乙個壞蛋,過一條河。
爸爸不在媽媽傷害兒子,媽媽不在爸爸傷害女兒,警察不在壞蛋傷害一家六口。
只有媽媽爸爸警察會開船,一次只能過兩個人,只有一艘船。
用程式實現怎麼過河。
思路見程式:
include#include #include using namespace std;
/*總體思路:用乙個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])
}
for(i=511; i<512; i++) //僅輸出從源點狀態0 1111 1111 到終點狀態 1 0000 0000的路徑
printf("<-%d \n", v);
} } int main()
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開始
}
題外話:這是面試某狗測試崗的課外作業。哈哈~~
霸面某狗,遇到乙個很nice的面試官,問的問題雖然回答的不是特別好,但是卻讓我大開眼界,原來類似智力題這麼好玩!!!哈哈~~
下午3點結束面試,拿到的題目——之前聽過沒做過的題目。來不及馬上做,又去趕另一家網際網路的面試。唉,一波面試向我襲來,有些措手不及。
晚上回去搜一下,原來是個小遊戲。哈哈,從沒想過自己能寫出個遊戲。
整個思考過程表示很痛苦,痛並快樂著。整個晚上很high,熬到夜裡3點多。。。竟然不感覺困。。。
因為剛開始思路有點繞路了,耽誤些時間,提交時間晚了2個多小時。所以,這可能也是沒通過的原因之一。
不過,找到了許久以來沒有的學習興趣與熱情。。。。哈哈,很nice!!!
oracle精華帖薈萃 絕對的好東西
關於大資料量的資料庫設計問題 ora 00904 識別符號無效 oracle 遠端訪問 mysql 分布式資料庫實踐經驗討論 資料庫定時掃瞄 經典 sql 語句收集 oracle 版 110 個 oracle 常用函式總結 行轉列通用過程 dblink 同步遠端帶 blob 欄位的表 乙個剔重 sq...
八人過河 程式 C
總體思路 用乙個9位的整數表示,當前所處的狀態,最高位表示河的左岸或者右岸。低8位依次表示警察,犯人,父親 母親,2個兒子,2個女兒 一次渡河可以看成是2個狀態之間的轉移。總體分兩步進行 step 1 先算出轉移矩陣 step 2 利用迪傑斯特拉算出,源點到終點最短路徑,所經歷的結點。define ...
7 56 方陣迴圈右移 10分 (我的精華帖)
本題要求編寫程式,將給定n n方陣中的每個元素迴圈向右移m個位置,即將第0 1 n 1列變換為第n m n m 1 n 1 0 1 n m 1列。輸入格式 輸入第一行給出兩個正整數m和n 1 n 6 接下來一共n行,每行n個整數,表示乙個n階的方陣。輸出格式 按照輸入格式輸出移動後的方陣 即輸出n行...