時限:1000ms 記憶體限制:10000k 總時限:3000ms
描述獨輪車的輪子上有紅、黃、藍、白、綠(依順時針序)5種顏色,在乙個如下圖所示的20*20的迷宮內每走乙個格仔,輪子上的顏色變化一次。獨輪車只能向前推或在原地轉向。每走一格或原地轉向90度均消耗乙個單位時間。現給定乙個起點(s)和乙個終點(t),求獨輪車以輪子上的指定顏色到達終點所需的最短時間。
輸入本題包含乙個測例。測例中分別用乙個大寫字母表示方向和輪子的顏色,其對應關係為:e-東、s-南、w-西、n-北;r-紅、y-黃、b-藍、w-白、g-綠。在測試資料的第一行有以空格分隔的兩個整數和兩個大寫字母,分別表示起點的座標s(x,y)、輪子的顏色和開始的方向,第二行有以空格分隔的兩個整數和乙個大寫字母,表示終點的座標t(x,y)和到達終點時輪子的顏色,從第三行開始的20行每行內包含20個字元,表示迷宮的狀態。其中'x'表示建築物,'.'表示路.
輸出在單獨的一行內輸出乙個整數,即滿足題目要求的最短時間。
輸入樣例
3 4 r n
15 17 y
******************xx
x.x...******......xx
x.x.x.....x..***x..x
x.******x.******xx.x
x.x.xx....x........x
x...***xx.x.xx.x.***
x.x.xx....x.x..x.x.x
x.x.x..xx...***x.***
x.x.xx.xx.x....x.x.x
x.x....xx.x.xx.x.x.x
x.x.x.***xx.xx.x.***
x.x.x.***xx....x...x
x.x.......x.xx...x.x
x.***.***.x.******xx
x.....xx.......x...x
***xx....x.******x.x
x..******x.***.***.x
x.xx...........x...x
x..x.***x.***x...***
******************xx
輸出樣例
解析:這個題也是乙個比較典型的分支限界法的題,即用廣搜法。分支限界法和回溯法解題的區別是:回溯法是求這個題是否有解,而分支限界法是在已知這個題有解的情況下,求最優解。這也是深搜和廣搜的根本區別。這也決定了深搜可以直接套用回溯法的模板,廣搜必須用佇列實現。**如下:
#include
#include
#include
#include
#include
using namespace std;
char map[21][21];
int used[21][21][5][4]=;
int step[21][21][5][4]=;
int dx[4]=;
int dy[4]=;
int sx,sy,sc,sd;
int tx,ty,tc;
typedef struct node
piont;
queueq;
piont find(piont x,int i)
if(i==1)
if(i==2)
return x;
}int bfs(int x,int y,int c,int d)}}
return -1;
}int changercolour(char x)
int changerdire(char x)
int main()
sc=changercolour(scolour);
sd=changerdire(sdire);
tc=changercolour(tcolour);
used[sx][sy][sc][sd]=1;
num=bfs(sx,sy,sc,sd);
cout<
}
演算法實驗三 分支限界法 六數碼問題
時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述現有一兩行三列的 如下 a b c d e f 把1 2 3 4 5 6六個數字分別填入a b c d e f格仔中,每個格仔乙個數字且各不相同。每種不同的填法稱為一種布局。如下 1 3 5 2 4 6 布局12 5 6 4 3...
演算法入門7 分支限界法
中已經提到過,回溯法的思想是深度優先搜尋加剪枝,與之相對,分支限界法的思想是廣度優先搜尋加剪枝。1.分支限界法 廣度優先搜素 1.簡單概述 分支限界法思路的簡單描述是 把問題的解空間轉化成了圖或者樹的結構表示,然後使用廣度優先搜尋策略進行遍歷,遍歷的過程中記錄和尋找所有可行解或者最優解。基本思想類同...
演算法入門(5) 分支限界法
一 基本描述 類似於回溯法,也是一種在問題的解空間樹t上搜尋問題解的演算法。但在一般情況下,分支限界法與回溯法的求解目標不同。回溯法的求解目標是找出t中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解,或是在滿足約束條件的解中找出使某一目標函式值達到極大或極小的解,即在某種意...