C 農夫過河問題

2021-09-19 06:44:22 字數 1483 閱讀 8876

/** 農夫過河問題

* * 大家有沒有看過我的c學習中的位算,我們用8位二進位制的數字來表示任務的完成與否,1完成、0未完成

* 現在我們用4個二進位制數來代表

* 第一位表示農夫(1:北岸,0:南岸)

* 第二位表示狼 (1:北岸,0:南岸)

* 第三位表示?? (1:北岸,0:南岸)

* 第四位表示白菜(1:北岸,0:南岸)

* 我們怎麼判斷農夫在哪(是不是把當前狀態與1000進行 & 操作,為1就在北岸,為0 就在南岸)

* 那麼判斷安全(羊的位置不等於狼,羊位置不等於白菜,且兩個狀態可以存在的是農夫在)

* 那麼接下去我們來進行廣度優先的遍歷,當滿足條件時,我們就把新的狀態push進佇列中去

* 且我們要記錄路徑,所以需要乙個並查集陣列,0-15即可

* */

#include #include #include "sqqueue.h"

#define bit(x) (1<#include using namespace std;

//第一位農夫。第二位狼。第三位白菜,第四位白菜

enum status;

//farmer的位置

int farmer(int location)

//wolf的位置

int wolf(int location)

//goat的位置

int goat(int location)

//cabbage的位置

int cabbage(int location)

int issafe(int location)

void farmer_location(int location)else

}void farmer_acrry(int currstatus, int afteratatus)

}void farmer_cross_river()

int location; //int正好是4個位元組

q.push(0);

arr[0] = 0; //第乙個狀態是預設的

int newlocation; //新的位置情況

// visited[0] = true;

while( (!q.isempty()) && (arr[15] == -1))

}} //for end

} //while end

//// for(int i = 0; i < 16; i++)

//現在從1111的位置通過並查集來推到0000的位置來推出路徑

int res[16] = ;

int counter = 0;

if(arr[15] == -1)else

//列印一下狀態

for(int i = 0; i < counter; i++)

for(int i = 0; i < counter; i++)

}}int main()

農夫過河問題

題目描述 有乙個農夫帶乙隻羊 一筐菜和乙隻狼過河。如果沒有農夫看管,則狼要吃羊,羊要吃菜。但是船很小,只夠農夫帶一樣東西過河。問農夫該如何解此難題?我的 include include include include include include include using namespace s...

農夫過河問題

問題 有一人帶著狼羊菜來到河的左岸欲乘乙隻小船過到右岸,每次人只能帶其中乙個過河 當有人在不會有事 當無人在時 就不允 許狼和羊在一起,也不允許羊和菜在一起,設計演算法以最少的次數過河?採用位向量,4個二進位制位的0 1情況表示狀態,顯而易見,共24 16種可能狀態。從高位到低位分別表示農夫 狼 白...

c實現農夫過河問題

問題描述 乙個農夫帶著乙隻狼 乙隻羊和一棵白菜,身處河的南岸。他要把這些東西全部運到北岸。問題是他面前只有一條小船,船小到只能容下他和一件物品,另外只有農夫能撐船。另外,因為狼能吃羊,而羊愛吃白菜,所以農夫不能留下羊和白菜或者狼和羊單獨在河的一邊,自己離開。請問農夫該採取什麼方案才能將所有的東西運過...