洛谷 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
复制代码

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

posted @   IXIS  阅读(191)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 上周热点回顾(1.20-1.26)
点击右上角即可分享
微信分享提示