有乙個僅由數字0與1組成的n×n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。
你的任務是:對於給定的迷宮,詢問從某一格開始能移動到多少個格仔(包含自身)。
輸入格式
第1行為兩個正整數n,m。
下面n行,每行n個字元,字元只可能是0或者1,字元之間沒有空格。
接下來m行,每行2個用空格分隔的正整數i,j,對應了迷宮中第i行第j列的乙個格仔,詢問從這一格開始能移動到多少格。
輸出格式
m行,對於每個詢問輸出相應答案。
輸入輸出樣例
輸入2 2
0110
1 12 2輸出4
4bfs版本
該題是查詢某一塊符合條件的個數,而且是多組輸入。
若用到單純bfs的思路的話,很容易造成重複查詢的情況,導致超時。
為了避免超時,這裡應當用bfs+記憶化剪枝的方式提高效率。
#include
using
namespace std;
int mg[
1010][
1010
], n, m;
//防止重複記格
bool flag[
1010][
1010]=
;int x[4]
=;int y[4]
=;struct nodenode, top;
bool
judge
(int xi,
int yi,
int x,
int y)
map<
int,
int> mm;
intmain()
while
(m--)}
// 防止重複記格
if(flag[xi]
[yi]
==false
) sum++
; flag[xi]
[yi]
=true
; mg[xi]
[yi]
=m+100010
; q.
pop();
} mm[m+
100010
]=sum;
}/* for(int i=1; i<=n; i++)
return0;
}
dfs版本
相比與該題的bfs版本,個人認為dfs思路較為巧妙,而bfs版本就是單純的模板改良。
主要思路:將要查詢的方格i,通過dfs試探的方式查詢出符合條件該方塊周圍符合的方塊數,同時利用flag二維陣列標記訪問過的方格,防止重複訪問(剪枝),並最終結果記錄在ans[i]中。
#include
using
namespace std;
int n, m;
int flag[
1010][
1010];
int mg[
1010][
1010];
int ans[
100010];
int x[4]
=;int y[4]
=;void
dfs(
int x,
int y,
int i)
intmain()
memset
(flag,-1
,sizeof
(flag));
memset
(ans,0,
sizeof
(ans));
for(
int i=
0; i)else
ans[i]
=ans[flag[x]
[y]];}
for(
int i=
0; i)return0;
}
總結
在該題中,在執行效率上dfs**比bfs**要高,但在儲存空間上bfs**比dfs**要小,各有所長。
希望能夠將自己的一些學習經驗分享給有需要的人。
我是小鄭,乙個堅持不懈的小白。
01迷宮 洛谷
有乙個僅由數字 000 與 111 組成的 n nn times nn n 格迷宮。若你位於一格0上,那麼你可以移動到相鄰 444 格中的某一格 111 上,同樣若你位於一格1上,那麼你可以移動到相鄰 444 格中的某一格 000 上。你的任務是 對於給定的迷宮,詢問從某一格開始能移動到多少個格仔 ...
01迷宮(洛谷P1141)
題目描述 有乙個僅由數字0與1組成的n n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。你的任務是 對於給定的迷宮,詢問從某一格開始能移動到多少個格仔 包含自身 資料範圍 n 1000 m 100000 分析 顯然互相...
洛谷1141 01迷宮
題目描述 有乙個僅由數字0與1組成的n n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。你的任務是 對於給定的迷宮,詢問從某一格開始能移動到多少個格仔 包含自身 輸入輸出格式 輸入格式 輸入的第1行為兩個正整數n,m。...