by medalplus
【題目描述】
有乙個僅由數字0與1組成的n×n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。
你的任務是:對於給定的迷宮,詢問從某一格開始能移動到多少個格仔(包含自身)。
【輸入描述】
輸入的第1行為兩個正整數n,m。
下面n行,每行n個字元,字元只可能是0或者1,字元之間沒有空格。
接下來m行,每行2個用空格分隔的正整數i,j,對應了迷宮中第i行第j列的乙個格仔,詢問從這一格開始能移動到多少格。
【輸出描述】
輸出包括m行,對於每個詢問輸出相應答案。
【分析】
此題比較坑爹
題目的意思就是求對於乙個點所在的聯通塊的個數
然後筆者想到了並查集和tarjan
結果看了下範圍n<=1000,m<=100000,然後就放棄了。。。
仔細想想其實就是個bfs
然後發現時間複雜度是o(n2m)
然後還是tle,就要考慮優化了
我們發現,對於乙個點所拓展的路徑上的所有點能走的格仔數是一樣的!
那麼也就是說,我們可以預處理出整個圖
這讓我們聯想到flood_fill
然後筆者就採用了dfs的方式
然後就爆棧了,發現對於1000*1000的完全圖(全都是1或0)會達到106層,所以必定會爆
這個時候可以考慮採用bfs的方式flood_fill
然後就tle了,筆者發現主要拖慢時間的是採取了stl的佇列
特別特別的耗時間,然後就手寫個佇列,再加卡常數的讀入
就ac了。。。。
有點淡淡的憂傷
【**】
1 #include 2 #include 3 #include 4using
namespace
std;56
#define rep(i,l,r) for(i=l;i<=r;i++)
7#define read scanf
8#define print printf910
const
int maxn=1001;11
const
int maxm=10000001;12
13struct
xoy;
1617
char
graph[maxn][maxn];
18int
record[maxm],id[maxn][maxn];
19xoy q[maxm];
20int
front,tail;
21int n,m;//
size of the board ; question numbers
22int
datax,datay;
2324
void bfs(int x,int y,int
index);
28xoy head;
29while(front!=tail);
37if(head.y-1>=1 && graph[head.x][head.y-1]!=graph[head.x][head.y])
38 q[tail++]=(struct xoy);
39if(head.x+1
<=n && graph[head.x+1][head.y]!=graph[head.x][head.y])
40 q[tail++]=(struct xoy);
41if(head.y+1
<=n && graph[head.x][head.y+1]!=graph[head.x][head.y])
42 q[tail++]=(struct xoy);
43} 44}
4546
intmain()
58 rep(i,1
,m)62
return0;
63 }
洛谷1141 01迷宮
題目描述 有乙個僅由數字0與1組成的n n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。你的任務是 對於給定的迷宮,詢問從某一格開始能移動到多少個格仔 包含自身 輸入輸出格式 輸入格式 輸入的第1行為兩個正整數n,m。...
洛谷 P1141 01迷宮
題目描述 有乙個僅由數字0與1組成的n n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。你的任務是 對於給定的迷宮,詢問從某一格開始能移動到多少個格仔 包含自身 輸入輸出格式 輸入格式 輸入的第1行為兩個正整數n,m。...
洛谷P1141 01迷宮
01迷宮 問題描述 有乙個僅由數字0與1組成的n n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。你的任務是 對於給定的迷宮,詢問從某一格開始能移動到多少個格仔 包含自身 分析 bfs,對於每個連通的格仔答案都是一樣的...