洛谷 P1141 記憶化搜尋

2021-09-13 14:46:13 字數 1274 閱讀 7476

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

思路:看資料範圍,很明顯的記憶化搜尋。一次dfs所能達到的所有地方構成乙個聯通塊,且此連通塊內的任意乙個方塊的答案都相同。

#include#include#include#include#include#include#includeusing namespace std;

typedef pairp;

int d[4][2]=,,,};

int dp[1005][1005];

int s[1005][1005];

int vis[1005][1005];

char b[1005][1005];

vectorvec;

int n,m;

int cnt;

void dfs(int x,int y)

}}int main()}}

}int x,y;

for(int i=0;ireturn 0;

}

BFS 聯通塊 記憶化搜素 洛谷P1141

題目鏈結在此!首先提一下,這個題目就是很簡單的bfs,dalao們的並查集我也沒看懂 我蒻 直接寫bfs肯定是會t的,因為每乙個搜圖都會有很多重複的地方被搜到了。下面說思路 在這個圖中,很明顯就是一些聯通塊,每乙個塊裡面的每乙個座標的答案都是一樣的。那麼我們就直接把搜過的地方的每乙個座標都記錄下來,...

01迷宮(洛谷P1141)

題目描述 有乙個僅由數字0與1組成的n n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。你的任務是 對於給定的迷宮,詢問從某一格開始能移動到多少個格仔 包含自身 資料範圍 n 1000 m 100000 分析 顯然互相...

洛谷P1464 Function 記憶化搜尋

對於乙個遞迴函式w a,b,c w a,b,c 如果a le 0a 0 or b le 0b 0 or c le 0c 0就返回值11.如果a 20a 20 or b 20b 20 or c 20c 20就返回w 20,20,20 w 20,20,20 如果a absi2011 比如 w 30,1,...