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列的一个格子,询问从这一格开始能移动到多少格。

输出格式:

输出包括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。

大家看到题目可能想起了深搜的板子题:迷宫【详见“迷宫”】,但这个题目和迷宫那个题显然不是很一样,但是根据题目来看我们也自然而然能够想到深搜DFS。首先这个题基本和迷宫问题没有什么很大的区别,只是少了一个条件,多了另外一个条件:不用判断障碍物,但必须要是在0上走1,在1上走0,也就是你下一次走的和你现在走的不能一样,而且这里依然要判断重复路径和越界。

首先和迷宫一样,我们定义一个dx[4],dy[4]用来循环行走的方向,也就是下一次行走的位置,分别是:

dx[4]={1,-1,0,0},dy[4]={0,0,1,-1},当然也可以定义一个二维的数组b[4][2]={{1,0}{-1,0}{0,1}{0,-1}},接下来定义一个res数组用来标记[x][y]这个点是否已经走过了,如果是,那么直接跳过,如果不是的话,再进行下一步。

下面附上代码:

#include<bits/stdc++.h>//万能头文件,但似乎会使运行变慢,因为无用库太多
using namespace std;
][];//01数组
][];//答案数组
][];//临时的坐标数组
int n, m, pl;//pl是当前区块连通的点数
][] = {{,},{,},{,-},{-,}}; //上下左右四方向的深搜
void dfs(int x, int y){
    pl++;//来到一个新的点,下面存储该点坐标
    lin[pl][] = x;
    lin[pl][] = y;
    res[x][y] = ;//这个点已经走过了,只是为了防止一趟深搜内部走重复点,所以不需要赋为pl
    ; i <= ; i++){
        ];//u,v即为目的地
        ];
         || u > n || v <  || v > n)//超出边界?
            continue;
        ) continue;//走到过了 ?
        if(a[u][v] == a[x][y]) continue;//根据题意,并不能走?
        dfs(u, v);//以上条件都不满足才向下搜索
    }
}
int main(){
    memset(res, , sizeof(res));//清空答案数组
    scanf("%d %d", &n, &m);
    ; i <= n; i++)
        ; j <= n; j++)
            scanf("%1d", &a[i][j]);//%1d,限字宽,读入方便
    ; i <= m; i++){
        pl = ;//重置pl
        int x, y;
        scanf("%d %d", &x, &y);
        ){//已经有答案
            printf("%d\n", res[x][y]);
            continue;
        }
        dfs(x, y);
        ; j <= pl; j++)
            res[lin[j][]][lin[j][]] = pl; //依据坐标数组,为答案数组填上pl
        printf("%d\n", pl);
    }
    ;
}

[LuoguP1141]01迷宫的更多相关文章

  1. 01迷宫 洛谷 p1141

    题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫, ...

  2. 洛谷——P1141 01迷宫

    P1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任 ...

  3. 【u115】&&【t031】 01迷宫

    01迷宫(maze01) Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相 ...

  4. Codevs 1629 01迷宫

    1629 01迷宫 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有一个由01组成的n*n格迷宫,若你位于一格0上,那么你可 ...

  5. luogu P1141 01迷宫 x

    P1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任 ...

  6. 洛谷P1141 01迷宫

    题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫, ...

  7. P1141 01迷宫

    https://www.luogu.org/problemnew/show/P1141 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样 ...

  8. P1141 01迷宫 dfs连通块

    题目描述 有一个仅由数字000与111组成的n×nn \times nn×n格迷宫.若你位于一格0上,那么你可以移动到相邻444格中的某一格111上,同样若你位于一格1上,那么你可以移动到相邻444格 ...

  9. P1141 01迷宫 DFS (用并查集优化)

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

随机推荐

  1. Android学习06Android应用程序的基本组件

    一个Android应用程序可以由几个不同的组件构成,Android应用程序的基本组件包括:Activity,Service,BroadcastReceiver,ContentProvider和Inte ...

  2. 基于 jdk1.7 发布一个 WebService 服务

    1 服务端的发布 第一步: 创建一个 Java 项目第二步: 创建一个类, 加入 Webservice 注解第三步: 提供一个方法 sayHello第四步: 在 main 方法中调用 jdk 提供的发 ...

  3. 线程同步(windows平台):互斥对象

    一:介绍 互斥对象是系统内核维护的一种数据结构,保证了对象对单个线程的访问权. 二:函数说明 创建互斥对象:    HANDLE CreateMutex(            LPSECURITY_ ...

  4. Visual Studio 创建封装自己的代码段(C#)

    https://www.cnblogs.com/awaTangjay/p/6644952.html 1.打开vs2012--工具--代码段管理器 2.进入代码管理器之后,语言选择Visual C#,然 ...

  5. nyoj 456——邮票分你一半——————【背包思想搜索】

    邮票分你一半 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述      小珂最近收集了些邮票,他想把其中的一些给他的好朋友小明.每张邮票上都有分值,他们想把这些邮票分 ...

  6. jquery点滴总结

    1.empty().remove().detach() empty():只移除了 指定元素中的所有子节点,而留下 了<p></p>,仍保留其在dom中所占的位置. remove ...

  7. linq(查询)

    1.改变数据库某一字段的属性 db.tableName.ToList().ForEach(x => x.State = false); 2.排序 db.tableName..toList().O ...

  8. 菜鸟学配置vim

    看啥都不会的菜鸟怎么进行vim配置 如果你想让你的vim和VS差不多你一定需要这个网址 http://www.open-open.com/lib/view/open1429884437588.html ...

  9. oracle之数据同步:Oracle Sql Loader使用说明(大批量快速插入数据库记录)

    1.准备表数据 select * from emp10; create sequence seq_eseq increment start maxvalue ; --得到序列的SQL语句 select ...

  10. http状态码汇总及代表意思

    成功2×× 成功处理了请求的状态码.200 服务器已成功处理了请求并提供了请求的网页.204 服务器成功处理了请求,但没有返回任何内容. 重定向3×× 每次请求中使用重定向不要超过 5 次.301 请 ...