洛谷題集 01迷宮(dfs bfs)

2021-10-05 23:41:42 字數 2093 閱讀 5101

有乙個僅由數字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。...