演算法核心:
void bfs(int x, int y)
for (int j = 1; j <= 3; j++)//迴圈走的步數
}} }
}
解釋一下,就是剛開始定義了:
這使得讓方向和陣列的i下標對應
先從剛開始的位置開始走,迴圈四個方向,這裡用i的大小(1---4)表示方向,然後如果這個方向需要當前的方向轉兩次就step+2,轉一次就加一,方向確定好了就來算朝這個方向走一步還是兩步還是三步,
這個要注意一下,因為brr陣列裡面只會走一格所以需要乘以j,然後判斷:
如果已經走好了的座標的step比當前計算的step小,那麼儲存當前結點入隊並且把這個結點的vis[xx][yy]=step
然後有幾個需要注意的小坑:
1.需要把地圖轉換成點狀地圖:
因為你看原圖中:
設定了乙個點為障礙以後,那麼整個正方形四個點就都是障礙了
2.邊界問題:
這個問題幾乎每個地圖類的題目都要注意:『
因為
這個機器是有半徑的,題目中有給出,所以我們走的點不能走到邊界上的一圈,所以要把邊界上的一圈設定成1
原始碼送上:
#include#include#includeusing namespace std;
const int max_len = 51;
int map[max_len][max_len];//存地圖
int vis[max_len][max_len];//存下每個位置需要的最少步數
int ans[5001] = ;//把每次搜尋可以走到的路線需要的步數記錄下來
int start_x, start_y, end_x, end_y;
char dd;//剛開始輸入的方向
int n, m;
int tot = 0;
int minl = 1000000;
typedef struct node ;
int brr[5][2] = ,
, ,
,};queuestt;
void bfs(int x, int y)
for (int j = 1; j <= 3; j++)
}} }
}int get_ans()
return flag;
}int main()
} map[n][i] = 1;
map[i][m] = 1;
} cin >> start_x >> start_y >> end_x >> end_y;
cin >> dd;
memset(vis, 1, sizeof(vis));
bfs(start_x, start_y);
int ans = get_ans();
if (ans < minl)
else
cout << "-1";
system("pause");
return 0;
}
較容易理解 的廣搜
include include include includeusing namespace std define max 10 int map max max int i,j int n int visited max max int dist max max int direction 4 2 ...
廣搜水題 Poj 3984
該題主要是學會任何在廣搜的過程中,記錄下最短的那條路徑 方法 佇列中的任何乙個節點的前驅節點唯一,利用這一點,記錄下前驅節點並深搜輸出 include include using namespace std 定義節點 struct node node 5 5 定義佇列 queueq 定義四個方向的想...
POJ 1067(廣搜水題)
參考某大牛的演算法,還寫這麼久,真悲劇 include include include using namespace std define afull 1 define bfull 2 define aempty 3 define bempty 4 define atob 5 define bto...