題目描述
有一個僅由數字0與1組成的n×n格迷宮。若你位於一格0上,那麼你可以移動到相鄰4格中的某一格1上,同樣若你位於一格1上,那麼你可以移動到相鄰4格中的某一格0上。
你的任務是:對於給定的迷宮,詢問從某一格開始能移動到多少個格子(包含自身)。
輸入輸出格式
輸入格式:
輸入的第1行爲兩個正整數n,m。
下面n行,每行n個字符,字符只可能是0或者1,字符之間沒有空格。
接下來m行,每行2個用空格分隔的正整數i,j,對應了迷宮中第i行第j列的一個格子,詢問從這一格開始能移動到多少格。
輸出格式:
輸出包括m行,對於每個詢問輸出相應答案。
輸入輸出樣例
輸入樣例#1: 複製
2 2
01
10
1 1
2 2
輸出樣例#1: 複製
4
4
說明
所有格子互相可達。
對於20%的數據,n≤10;
對於40%的數據,n≤50;
對於50%的數據,m≤5;
對於60%的數據,n≤100,m≤100;
對於100%的數據,n≤1000,m≤100000。
#include<iostream>
#include<string>
#include<string.h>
using namespace std;int n,m;// 變量定義位置不對會出現錯誤
string a[100000];
int mark[1005][1005];
int ans[1000000];
void dfs(int x,int y,char z,int now){
if(x<0||x>=n||y<0||y>=n||mark[x][y]!=-1||a[x][y]==z) return ;
mark[x][y]=now;ans[now]++;
dfs(x-1,y,a[x][y],now);dfs(x+1,y,a[x][y],now);
dfs(x,y-1,a[x][y],now);dfs(x,y+1,a[x][y],now);
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
memset(mark,-1,sizeof(mark));
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;x--,y--;
if(mark[x][y]==-1) dfs(x,y,'#',i);
else ans[i]=ans[mark[x][y]];
}
for(int i=0;i<m;i++) cout<<ans[i]<<endl;
return 0;
}