zoukankan      html  css  js  c++  java
  • 洛谷 P1141 01迷宫

    题目描述

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

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

    输入输出格式

    输入格式:

     

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

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

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

     

    输出格式:

     

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

     

    输入输出样例

    输入样例#1: 复制
    2 2
    01
    10
    1 1
    2 2
    
    输出样例#1: 复制
    4
    4
    

    说明

    所有格子互相可达。

    对于20\%20%的数据,n≤10n10;

    对于40\%40%的数据,n≤50n50;

    对于50\%50%的数据,m≤5m5;

    对于60\%60%的数据,n≤100,m≤100n100,m100;

    对于100\%100%的数据,n≤1000,m≤100000n1000,m100000。

    /*最简单的宽搜 70分*/
    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    int n,m,tot;
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    int map[1010][1010],vis[1010][1010];
    void bfs(int x,int y){
        queue<int>que1,que2,que3;
        vis[x][y]=1;tot++;
        que1.push(x);que2.push(y);
        que3.push(map[x][y]);
        while(!que1.empty()){
            int nowx=que1.front();que1.pop();
            int nowy=que2.front();que2.pop();
            int nowcol=que3.front();que3.pop();
            for(int i=0;i<4;i++){
                int cx=nowx+dx[i];
                int cy=nowy+dy[i];
                if(cx>=1&&cx<=n&&cy>=1&&cy<=n&&map[cx][cy]!=nowcol&&!vis[cx][cy]){
                    vis[cx][cy]=1;
                    que1.push(cx);
                    que2.push(cy);tot++;
                    que3.push(map[cx][cy]);
                }
            }
        }
    }
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++){
                char x;cin>>x;
                if(x=='0')    map[i][j]=0;
                else if(x=='1')    map[i][j]=1;
            }
        for(int i=1;i<=m;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            bfs(x,y);
            cout<<tot<<endl;tot=0;
            memset(vis,0,sizeof(vis));
        }
    }
    70分
    /*并查集维护两个点是否联通,最后O(1)查询*/
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int n,m;
    int map[1010][1010];
    int dx[4]={0,0,1,-1};
    int dy[4]={1,-1,0,0};
    int fa[1000010],num[1000010];
    int ask(int x,int y){
        return n*(x-1)+y;
    }
    int find(int x){
        if(fa[x]==x)    return fa[x];
        else return fa[x]=find(fa[x]);
    }
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++){
                char x;cin>>x;
                if(x=='0')    map[i][j]=0;
                else if(x=='1')    map[i][j]=1;
            }
        for(int i=1;i<=n*n;i++)    fa[i]=i;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++){
                for(int k=0;k<4;k++){
                    int cx=i+dx[k];
                    int cy=j+dy[k];
                    if(cx>=1&&cx<=n&&cy>=1&&cy<=n&&map[cx][cy]!=map[i][j]){
                        int tx=find(ask(i,j));
                        int ty=find(ask(cx,cy));
                        if(tx==ty)    continue;
                        fa[ty]=tx;
                    }
                }
            }
        for(int i=1;i<=n*n;i++)
            num[find(i)]++;
        for(int i=1;i<=m;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            cout<<num[find(ask(x,y))]<<endl;
        }
    }
    100分
  • 相关阅读:
    uva 11294 Wedding
    uvalive 4452 The Ministers’ Major Mess
    uvalive 3211 Now Or Later
    uvalive 3713 Astronauts
    uvalive 4288 Cat Vs. Dog
    uvalive 3276 The Great Wall Game
    uva 1411 Ants
    uva 11383 Golden Tiger Claw
    uva 11419 SAM I AM
    uvalive 3415 Guardian Of Decency
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/9691132.html
Copyright © 2011-2022 走看看