P1141 01迷宮 記憶化BFS

2021-08-21 16:00:48 字數 1505 閱讀 4802

有乙個僅由數字 000 與 111 組成的 n×nn \times nn×n 格迷宮。若你位於一格0上,那麼你可以移動到相鄰 444 格中的某一格 111 上,同樣若你位於一格1上,那麼你可以移動到相鄰 444 格中的某一格 000 上。

你的任務是:對於給定的迷宮,詢問從某一格開始能移動到多少個格仔(包含自身)。

輸入格式:

第 111 行為兩個正整數 n,mn,mn,m 。

下面 nnn 行,每行 nnn 個字元,字元只可能是 000 或者 111 ,字元之間沒有空格。

接下來 mmm 行,每行 222 個用空格分隔的正整數 i,ji,ji,j ,對應了迷宮中第 iii 行第 jjj 列的乙個格仔,詢問從這一格開始能移動到多少格。

輸出格式:

mmm 行,對於每個詢問輸出相應答案。

輸入樣例#1:複製

2 2

0110

1 12 2

輸出樣例#1:複製

4

4

所有格仔互相可達。

對於 20%20\%20% 的資料, n≤10n≤10n≤10 ;

對於 40%40\%40% 的資料, n≤50n≤50n≤50 ;

對於 50%50\%50% 的資料, m≤5m≤5m≤5 ;

對於 60%60\%60% 的資料, n≤100,m≤100n≤100,m≤100n≤100,m≤100 ;

對於 100%100\%100% 的資料, n≤1000,m≤100000n≤1000,m≤100000n≤1000,m≤100000 。

思路:本題n的範圍較小,但是m的範圍比較大,所以很明顯要用到記憶話搜尋(無論dfs或bfs)

仔細觀察不難發現,從乙個聯通快出發,掃瞄到的所有聯通快最終能移動到的格仔數與初始聯通塊一樣

所以在一次搜尋過後,除了本身賦值外,再把路徑的聯通塊同樣賦值,即可達到記憶化的效果.

#include #include #include #include #include #include #include #define maxn 100000

using namespace std;

typedef long long ll;

ll n,m,a,b,ma[1005][1005],dx[4]=,dy[4]=; //ma記錄最終結果 dx dy為方向陣列

bool flag[1005][1005]; //標記陣列

char arr[1005][1005]; //圖

struct why //佇列結構體

};struct w

;ll bfs()

}a.pop(); //彈出隊首

}for(int k = 0; k < tt; k++)}}

return 0;

}int main()

return 0;

}

洛谷P1141 01迷宮 記憶化搜尋

可以用bfs來做,但是資料毒瘤,如果每次詢問都執行一次bfs,會有三個tle。可以將路途經過的點儲存起來並且記錄答案,如果詢問的點已經被記錄了答案,直接輸出答案就行了,這裡是用乙個佇列存經過的點。d陣列用於標記是否能走到,注意每次bfs不需要更新d陣列。另外參考了大佬們的題解,發現用dfs會更簡單。...

洛谷 P1141 01迷宮BFS題解

題目描述 有乙個僅由數字0與1組成的n n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。你的任務是 對於給定的迷宮,詢問從某一格開始能移動到多少個格仔 包含自身 輸入格式 第1行為兩個正整數n,m。下面n行,每行n個字...

洛谷 P1141 01迷宮

題目描述 有乙個僅由數字0與1組成的n n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。你的任務是 對於給定的迷宮,詢問從某一格開始能移動到多少個格仔 包含自身 輸入輸出格式 輸入格式 輸入的第1行為兩個正整數n,m。...