廣搜題(較複雜)

2021-08-20 15:03:08 字數 2094 閱讀 9808

演算法核心:

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...