1629 01迷宫

1629 01迷宫

时间限制: 1 s

空间限制: 256000 KB

题目等级 : 钻石 Diamond

题解

查看运行结果

题目描述 Description

有一个由01组成的n*n格迷宫,若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上。那么对于给定的迷宫,询问从某一格开始能移动到多少格。

输入描述 Input Description

输入的第1行为两个正整数n,m。

下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格。

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

输出描述 Output Description

输出包括m行,对于每个询问输出答案。

样例输入 Sample Input

2 2

01

10

1 1

2 2

样例输出 Sample Output

4

4

数据范围及提示 Data Size & Hint

【样例说明】

所有格子互相可达。

【数据规模】

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

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

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

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

对于100%的数据,n≤1000,m≤1000000。

分类标签 Tags 点此展开

暂无标签

#include<cstdio>
#include<iostream>
#include<queue>
using namespace std;
#define N 1001
int n,m,dx[]={1,0,0,-1},dy[]={0,1,-1,0};
struct node{
    int x,y;
}o,t;
queue<node> q;
char str[N];
int a[N][N],f[N][N],mem[N][N];
inline void bfs(){
    for(int i=0;i<m;i++){
        cin>>o.x>>o.y;
        o.x--;o.y--;
        if(mem[o.x][o.y]){
            printf("%d\n",mem[o.x][o.y]);continue;
        }
        int cnt=0;
        q.push(o);
        while(!q.empty()){
            o=q.front();
            for(int j=0;j<4;j++){
                t.x=dx[j]+o.x;
                t.y=dy[j]+o.y;
                if(t.x<0||t.y<0||t.x>=n||t.y>=n);else
                if(f[t.x][t.y]!=-1&&a[t.x][t.y]+a[o.x][o.y]==1){//关键在这里
                    f[t.x][t.y]=-1;
                    q.push(t);
                    cnt++;
                }
            }
            q.pop();
        }
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                if(f[i][j]==-1)
                    f[i][j]=0,
                    mem[i][j]=cnt;
        if(cnt==0) cnt++;
        printf("%d\n",cnt);
    }
}
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>str;
        for(int j=0;j<n;j++)
            a[i][j]=str[j]-‘0‘;
    }
    bfs();
    return 0;
}
时间: 2024-10-11 22:21:34

1629 01迷宫的相关文章

luogu P1141 01迷宫 x

P1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移

洛谷OJ P1141 01迷宫 解题报告

洛谷OJ P1141 01迷宫 解题报告 by MedalPluS [题目描述]    有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上.你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身).   [输入描述]   输入的第1行为两个正整数n,m.  下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格.  接下来m行,每行2个用空格分隔的正整数i,j,对

【luouP1141】01迷宫

1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动

01迷宫

01迷宫 使用深度优先探索算法求解01迷宫的逃离路线个数. 逃跑路线 左图表示的是一个4*5的01矩阵,这个矩阵就是一个01迷宫. 如左图,以红色0作为起点,绿色0作为终点,每一次行进只能选择上下左右中值为0且未走过的位置,满足上述条件的路线,即为一条迷宫逃跑路线.如右图中,蓝色的路线即为一条逃跑路线. 题目描述 使用mips实现01迷宫路线数目计算. 以0x00000000为数据段起始地址. 输入一个n*m的01矩阵作为01迷宫,并给定他的起点与终点,求出他不同逃跑路线的数目(不同逃跑路线中可

洛谷——P1141 01迷宫

https://www.luogu.org/problem/show?pid=1141 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整

P1141 01迷宫

题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格. 输出格式

luogu cogs P1141 01迷宫

题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入输出格式 输入格式: 输入的第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格. 输出格式

P1141 01迷宫(连通块模板)

题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身). 输入格式 第1行为两个正整数n,m. 下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格. 接下来m行,每行2个用空格分隔的正整数i,j,对应了迷宫中第i行第j列的一个格子,询问从这一格开始能移动到多少格. 输出格式 m行,对于每个询问输

noip 01迷宫(BFS+记忆化)

题目链接:https://www.luogu.org/problem/show?pid=1141 题意:给出一个仅由数字0与1组成的n×n格迷宫.放0的那一格可以4个方向走到放1那一格,1也是四个方向走到放0的那一格.算上本身的那格.求最多能移动多少格子. 数据比较大,如果直接用bfs搜的话会暴时.所以需要每次搜索完都记录一下. 1 #include <iostream> 2 #include <algorithm> 3 #include <queue> 4 using