有乙個僅由數字 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輸出樣例#1:複製0110
1 12 2
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。...