洛谷P2199 最後的迷宮 BFS DFS

2021-08-27 16:13:28 字數 1413 閱讀 5581

給出乙個圖及起點和終點,只要到達終點所在行、列或對角線上且兩點之間沒有牆就算到達終點。求到達終點的最少步數。

這道題真的算是藍題嗎。。。

算是很裸的廣搜了。

這道題和裸的廣搜其實只有乙個差別:只要到達終點所在行、列或對角線上且兩點之間沒有牆就算到達終點。也就是說,這道題有多個終點,到達任意乙個即可。

那麼就直接跑一邊dfs,從原終點往8個方向跑,直到遇見牆為止。那麼走到的點就都是成立的終點。

之後就從起點跑bfs。就完全是裸的了。

還有這道題說100

%100\%

100%

的資料範圍是n×m

≤16384

n\times m\leq 16384

n×m≤16

384,所以如果是最壞情況就會有n=1

,m

=16384

n=1,m=16384

n=1,m=

1638

4,那麼開二維陣列就會炸記憶體。所以要把二維陣列壓成乙個一位陣列。

有多組資料,所以時間複雜度為o(t

nm

)o(tnm)

o(tnm)

#include

#include

#include

using

namespace std;

const

int dx=

;const

int dy=

;int n,m,sx,sy,tx,ty,head,tail,ans[

20501

],state[

20501];

bool a[

20501

],map[

20501

],p[

20501];

char c;

void

dfs(

int x,

int y,

int k)

//找終點

void

bfs(

)//裸的廣搜

state[tail]

=(x-1)

*m+y;

//入隊

if(p[state[tail]

]||map[state[tail]])

//來到過這個點或是牆

p[state[tail]]=

1;ans[tail]

=ans[head]+1

;if(a[state[tail]])

//到達任意乙個終點}}

printf

("poor harry\n");

//無法到達

}int

main()

while(1

)bfs()

;}return0;

}

洛谷P2199 最後的迷宮 BFS DFS

給出乙個圖及起點和終點,只要到達終點所在行 列或對角線上且兩點之間沒有牆就算到達終點。求到達終點的最少步數。這道題真的算是藍題嗎。算是很裸的廣搜了。這道題和裸的廣搜其實只有乙個差別 只要到達終點所在行 列或對角線上且兩點之間沒有牆就算到達終點。也就是說,這道題有多個終點,到達任意乙個即可。那麼就直接...

洛谷P2199 最後的迷宮 BFS DFS

給出乙個圖及起點和終點,只要到達終點所在行 列或對角線上且兩點之間沒有牆就算到達終點。求到達終點的最少步數。這道題真的算是藍題嗎。算是很裸的廣搜了。這道題和裸的廣搜其實只有乙個差別 只要到達終點所在行 列或對角線上且兩點之間沒有牆就算到達終點。也就是說,這道題有多個終點,到達任意乙個即可。那麼就直接...

洛谷 P2199 最後的迷宮 (尚賢)

暴力 詳見 存圖時先將牆和邊界都賦值為false,這樣bfs時可以少判邊界 include include include include include using namespace std struct node node const int xx,const int yy,const int...