加粗樣式在這裡插入**片
問題描述:
獵人、狗、男人帶著男孩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 思路 有兩種可以快速過河的策略,一是由最快的...