luogu P1141 01迷宮【dfs記憶化】

題目描述
有一個僅由數字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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章