農夫過河問題

2022-08-27 22:45:15 字數 1577 閱讀 8008

問題:有一人帶著狼羊菜來到河的左岸欲乘乙隻小船過到右岸,

每次人只能帶其中乙個過河

,當有人在不會有事

,當無人在時

,就不允

許狼和羊在一起,

也不允許羊和菜在一起,設計演算法以最少的次數過河?

採用位向量,4個二進位制位的0/1情況表示狀態,顯而易見,共24=16種可能狀態。從高位到低位分別表示農夫、狼、白菜和羊。

0000(整數0)表示都在左岸,目標狀態1111(即整數15)表示都到了右岸。有些狀態0011,0101,0111,0001,1100,1001是不允許出現的,

因為這些狀態是不安全狀態。狀態圖如下:

typedef struct seqqueue * pseqqueue; // 重定義佇列指標型別名

pseqqueue createemptyqueue_seq()

int isemptyqueue_seq( pseqqueue paqu )

// 將元素x插在隊尾

void enqueue_seq( pseqqueue paqu, datatype x )

}// 刪除佇列頭部元素

void dequeue_seq( pseqqueue paqu )

// 隊首狀態

datatype frontqueue_seq( pseqqueue paqu )

/* 使用4個二進位制位0/1表示狀態

從高位到地位分別表示農夫、狼、羊和白菜

0000表示均在左岸,1111表示均在右岸

二進位制0x08即1000

0x08----1000

0x04----0100

0x02----0010

0x01----0001

以下是個體狀態判斷函式farmer()、wolf()、cabbage()、goat()返回0/1表示左岸/右岸

*/int farmer(int location)

int wolf(int location)

int goat(int location)

int cabbage(int location)

//安全狀態的判斷函式

int safe(int location)

//將十進位制數val轉化為二進位制輸出

void printbinary(int val)

} void farmerproblem() }}

}//到達最終狀態

if(route[15] != -1)

return;

}}

}else

printf("no solution.\n");

}int main()

農夫過河問題

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

求解農夫過河問題

問題 乙個農夫帶著一匹狼 乙隻羊 一顆白菜要過河,只有一條船而且農夫每次最多只能帶乙個動物或物品過河,並且當農夫不在的時候狼會吃羊,羊會吃白菜,列出所有安全將所有動物和物品帶過河的方案。思路分析 顯然這不是乙個最優解的問題,最容易想到的方法就是遍歷了,設法用遍歷列舉出所有可能出現的情況,根據條件選取...

C 農夫過河問題

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