洛谷P1411 01迷宫

题目描述

有一个仅由数字00与11组成的n \times nn×n格迷宫。若你位于一格0上,那么你可以移动到相邻44格中的某一格11上,同样若你位于一格1上,那么你可以移动到相邻44格中的某一格00上。

你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身)。

输入格式

11行为两个正整数n,mn,m。

下面nn行,每行nn个字符,字符只可能是00或者11,字符之间没有空格。

接下来mm行,每行22个用空格分隔的正整数i,ji,j,对应了迷宫中第ii行第jj列的一个格子,询问从这一格开始能移动到多少格。

输出格式

mm行,对于每个询问输出相应答案。


 

一道DFS题。

在迷宫中如果能从一个点A到点B那么也可也从点B到点A。

那么只要从一个点开始搜索,然后将所有搜到的点赋上同一个值就行了。

这题数据比较大,所以要先预处理一遍然后再查询。

 

#include<iostream>
#include<cstring>
using namespace std;
int n,m,ans[1005][1005],as,kans[1000005];
int map[1005][1005];
void g(int x,int y,int bl);
int main()
{
    char q;
    int i,j;
    int a,b;
    cin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
        {
            cin>>q;
            if(q=='1')
                map[i][j]=1;
            else
                map[i][j]=0;
        }
            
    for(i=0;i<=n+1;i++)
    {
        map[0][i]=-1;
        map[i][0]=-1;
        map[n+1][i]=-1;
        map[i][n+1]=-1;
    }
    as=0;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(ans[i][j]==0)
            {
                as++;
                g(i,j,!map[i][j]);
            }
    for(i=1;i<=m;i++)
    {
        cin>>a>>b;
        cout<<kans[ans[a][b]]<<endl;
    }
    return 0;
}
void g(int x,int y,int bl)
{
    if(ans[x][y]!=0)
        return ;
    if(map[x][y]==bl)
        return ;
    if(map[x][y]==-1)
        return ;
    ans[x][y]=as;
    kans[as]++;
    g(x+1,y,!bl);
    g(x,y+1,!bl);
    g(x-1,y,!bl);
    g(x,y-1,!bl);
    return ;
}

 

posted @ 2019-08-17 22:41  nenT  阅读(135)  评论(0)    收藏  举报