洛谷P1411 01迷宫

一道DFS题。

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

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

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

这好像是一道经典的BFS题

#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 ;
}

猜你喜欢

转载自www.cnblogs.com/nenT/p/11370271.html