用程式設計解決過河問題

2021-08-08 22:36:07 字數 1532 閱讀 1252

很久沒有做題了,突然很懷念,於是心血來潮,想起了曾經小弟叫我做的這道趣味題,就花了x個小時(此處不好意思打出來,各位腦補吧)的時間,終於解決了它,那種久違的成就感好像又回來了……但是我的方法不是特別好,**有點長(以我的水平只能這樣了)。不過還是打算把它貼出來,紀念一下。

出一道題讓大家思考: 有一條河,河邊有獵人,狼,乙個男人帶著兩個小孩,還有乙個女人帶著兩個小孩。 條件:

1.如果獵人離開,狼就會吃掉所有人。 2。如果男人離開,女人就會掐死他的小孩,若女人離開,男人也會掐死她的小孩 3.河裡有一條船,所有人都在河的一邊,船上只能坐兩人。(只有獵人,男人,女人會划船;乙個小孩算乙個人,狼也算乙個。) 問:這八人該如何過河?

分析:解這道智力題我並沒有用什麼特別的演算法,所以就算你沒學過動態規劃、回溯、矩陣也可以求解這道題,因為我用的是最簡單粗暴的方法。

首先,開闢乙個陣列a[8],表示這8個人,這8個人我是規定好順序的,從下標0到8分別表示獵人、男、女、狼、男1、男2、女1、女2。陣列a儲存的是每個人的位置狀態,0表示人在此岸,1表示在對岸。同樣的,船也要有位置狀態,所以我定義了乙個變數boat,0表示船在此岸,1表示在對岸。當boat==a[i]時,表示船與該人在同一岸,可以上船。

然後,每一次渡河都需要記錄下來。所以,我開闢了兩個陣列b1[100]和b2[100],儲存每一次渡河的兩個人是誰(也就是只能等於0~7中的任意乙個數字)。

至於**中的其他變數:count代表第幾次渡河;flag代表這種方案渡河是否可行,0表示不可行,1表示可行;judge()方法檢驗渡河方案。

#include #include void judge(int a,int k,int t);

int flag;

int count=1;

int b1[100],b2[100];

int main()

for(i=0;i<100;i++)

//暴力迴圈直至8個人全都渡河

while(1)

//a[j]表示渡河的另乙個人

for(j=0;j<8;j++)

//兩人都上船之後,劃到對岸,位置狀態改變

a[i]=a[j]=1-boat;

//判斷這樣渡河是否可以,judge()方法會改變flag的值

judge(a,i,j);

//flag=0表示渡河失敗,兩個人要回去,位置狀態也要恢復

if(flag==0)

//flag=1表示渡河成功,記錄此次渡河的人,並改變船的位置狀態

else if(flag==1)

}//跳出外層迴圈

if(flag==1)

}//i=3說明沒有人可以划船了,說明之前的渡河有問題,船與人都倒退一次。

if(i==3)

//判斷8人是否全都過河

用程式設計解決實際問題

在現實程式設計中,如果我們遇到了已經學過的演算法不適合解決的問題,該怎麼辦?其實很簡單,就是把控制流程和資料結構想清楚,然後用 實現就好了!在本章內我們就來看兩個例子。題目內容 這些錢及其理財收益僅僅用於你個人的日常生活消費 不買房 不買車 不置產,不用於大病 也不包括結婚生子的費用,只用來過日子。...

用程式設計解決小白鼠問題

理解 需要用最少的小白鼠查出哪瓶是毒藥水,所以就不能用1000只小白鼠 我們可以嘗試使用程式設計的思維看待這個問題 一 將1000個瓶子都貼上標籤,1 1000.二 將1 1000翻譯成二進位制編碼,可以看出210只是1024,所以只需要,10個位數就能表達1 1000.三 在十個位數上分別放上乙隻...

過河「程式設計題」

緣 noip2005 過河 題目描述 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,...