• 洛谷 P1141 01迷宫


                   洛谷 P1141 01迷宫

    题目描述

    有一个仅由数字 0 与 1 组成的 n×n 格迷宫。若你位于一格0上,那么你可以移动到相邻 

    格中的某一格 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<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    char a[5000][5000];
    bool vis[5000][5000],g[5000][5000];
    int n,m,x,y,ans,cnt=1,d[1000005],f[5000][5000];
    int xx[4]= {0,0,1,-1},yy[4]= {1,-1,0,0};
    void dfs(int x,int y) {
        if(x<1||y<1||x>n||y>n||f[x][y]) return ;
        f[x][y]=cnt;
        ans++;
        for(int i=0; i<4; i++) {
            int fx=x+xx[i],fy=y+yy[i];
            if(a[fx][fy]!=a[x][y]) dfs(fx,fy);
        }
        d[cnt]=ans;
    }
    int main() {
        cin>>n>>m;
        for(int i=1; i<=n; i++) 
            for(int j=1; j<=n; j++)
                cin>>a[i][j];
        while(m--) {
            cin>>x>>y;
            if(!f[x][y]) {
                ans=0;dfs(x,y);cnt++;
            }
            ans=d[f[x][y]];
            cout<<ans<<endl;
        }
        return 0;
    }
    View Code

    握不住的沙,不如扬了它。

  • 相关阅读:
    scala基础题--面向对象2
    scala基础题--面向对象1
    scala基础题--函数可以没有返回值案例,编写一个函数,从终端输入一个整数,打印出对应的金字塔
    scala基础题--100以内的数求和,求出当和第一次大于20的当前数【for】
    scala练习题--万年历
    Java中接口和Sala中的特质的区别?
    scala学习笔记
    Java反射
    【JDBC】C3P0连接池的使用
    【JDBC】工具类的抽取
  • 原文地址:https://www.cnblogs.com/GTBD/p/9211088.html
Copyright © 2020-2023  润新知