給出乙個圖及起點和終點,只要到達終點所在行、列或對角線上且兩點之間沒有牆就算到達終點。求到達終點的最少步數。
這道題真的算是藍題嗎。。。
算是很裸的廣搜了。
這道題和裸的廣搜其實只有乙個差別:只要到達終點所在行、列或對角線上且兩點之間沒有牆就算到達終點。也就是說,這道題有多個終點,到達任意乙個即可。
那麼就直接跑一邊dfs,從原終點往8個方向跑,直到遇見牆為止。那麼走到的點就都是成立的終點。
之後就從起點跑bfs。就完全是裸的了。
還有這道題說100%1
00%的資料範圍是n×m
≤16384n×
m≤16
384,所以如果是最壞情況就會有n=1
,m=16384n=
1,m=
1638
4,那麼開二維陣列就會炸記憶體。所以要把二維陣列壓成乙個一位陣列。
有多組資料,所以時間複雜度為o(t
nm)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...