A 演算法實現獵人渡河問題

2021-10-04 10:17:30 字數 3958 閱讀 8604

加粗樣式在這裡插入**片

問題描述:

獵人、狗、男人帶著男孩1、男孩2,女人帶著女孩1、女孩2,一共8個體。一艘小船,一次只能過兩個個體,狗和四個小孩不會划船。

注意:(1)獵人不在,狗咬任何人;

(2)男人不在,女人打男孩;

(3)女人不在,男人打女孩

**如下:

**

/*思路:用0表示在此岸,1表示在對岸(0,0,0,0,0,0,0,0,0)分別表示獵人,男人

女人,狗狗,女孩,女孩,男孩,男孩,船在此岸。在滿足條件是進行狀態轉移確定

狀態結點資訊*/

#include

#include

#include

"a_def.h"

#include

"a_algo.h"

intmain()

;int end[9]

=;a_star

(begin,end)

;return0;

}using

namespace std;

void

create

(astar &head)

intis_empety

(astar head)

intis_somebefor

(astar sstar, astar head)

if(i ==9)

return1;

head = head->parents;

}return0;

}int

is_ok

(astar a)

void

add_open

(astar &open,astar &check)

check->next = p->next;

p->next = check;

}int

g_value

(astar sstar, astar& head)

return sstar->g;

}int

h_value

(astar sstar)

if(sum >=2)

else

}else

sstar->h =

2*sum;

return sstar->h;}}

void

open_enterfirst

(int begin,

int end)

void

out(astar head,astar& h)

h = head->next;

head->next = head->next->next;

h->next =

null;}

void

enter_close

(astar sstar, astar& check_l)

void

out_path

(astar a_check)

else

continue;}

else

continue;}

}else

else

continue;}

else

continue;}

}}} cout << endl;

a_check = a_check->parents;}}

}int

is_in

(astar a_check_l_one,astar check,astar &m,astar &n)

if(i ==9)

n = check;

check = check->next;

}return0;

}int

is_same

(astar a, astar sstar)

if(i ==9)

return1;

a = a->next;

}return0;

}void

a_check_ls

(astar a_check_l, astar a_check)

if(t0 !=1)

}}}else

break;}

for(

int i =

0; i <=

8; i++

) a_check->t[i]

= t2[i]

;for

(int i =

0; i <=

2; i++)}

}}elseif(

is_ok

(a_check))}

//for (int i = 0; i <= 8; i++) a_check->t[i]=t2[i];

}for

(int i =

0; i <=

8; i++

) a_check->t[i]

=t2[i]

; a_check->t[8]

=1;for

(int i =

0; i <=

2; i++)}

}}}for

(int i =

0; i <=

8; i++

) a_check->t[i]

= t2[i];}

intis_over

(astar over)

if(i ==9)

return1;

return0;

}void

a_star

(int begin,

int end)

a_check_ls

(a_check_l, a_check)

;/*

while (is_empety(a_check_l))

*/while

(is_empety

(a_check_l))}

elseif(

is_in

(a_check_l_one, close, m, n))}

else}}

if(f)

out_path

(a_check);}

typedef

struct

a as,

* astar;

typedef

struct

aaaas,

*aastar;

astar open;

astar close;

**

執行結果

第1步:獵人和狗過河

第2步:獵人回來

第3步:獵人帶乙個女兒過河

第4步:獵人和狗回來

第5步:女人帶另外乙個女孩過河

第6步:女人回來

第7步:男人和女人過河(還要把船帶回來,所以男人得過去)

第8步:男人過來

第9步:獵人和狗過去

第10步:女人回來

第11步:女人和男人過河

第12步:男人回來

第13步:男人帶乙個男孩過河

第14步:獵人和狗回去

第15步:獵人和男孩過河

第16步:獵人回去

第17步:獵人和狗過來

這個獵人渡河問題本身挺簡單的,但要用a*演算法實現起來並不太簡單,因為細節實在太多。另外這題的轉態結點在open表和cloued表中的並不多,這使得一些astar演算法中的必須要的操作在這裡並沒有起到作用,所以這個並不是astar演算法的乙個典型問題。那為啥我還要寫這個呢?我們小唐老師在講astar演算法時說誰要是用astar演算法寫出這個,誰期末就不用考了。所以我就搞起來了,,。

golang實現商人渡河問題 暴力解法

學習需要,結合模型實現了商人過河問題。包括 n商人n隨從 m小船問題 人,貓,雞,公尺過河問題 目前使用暴力演算法,後期打算寫下dijstra演算法求解 畢竟暴力演算法無法證明無解性 s允許狀態集合 d允許決策集合 n對商人隨從過河const n 3 遍歷演算法 輸入 商人 隨從人數 n 3,4,5...

農夫 獵人問題

農夫 獵人問題和蘋果 桔子問題非常類似,也是作業系統中的經典問題 1.問題描述 有乙個鐵籠子,每次只能放入乙個動物。獵手向籠中放入老虎,農夫向籠中放入 羊 動物園等待取籠中的老虎,飯店等待取籠中的羊。2.問題分析 和蘋果 桔子問題類似,有4個程序,籠子是互斥量,獵手和動物園是同步關係,農夫和飯店也是...

快速渡河(貪心演算法)

問題描述 有n的人需要過河,但只有乙隻船,且一次只能載兩個人。每個人都有乙個渡河的速度,過河的速度取決於速度最慢的那乙個,求所有人過完河的最短時間。輸入乙個n,表示有n個人。接著輸入n個整數表示每個人過河需要的時間。例如 4 1 2 5 10 輸出 17 思路 有兩種可以快速過河的策略,一是由最快的...