题目链接:https://www.luogu.org/problemnew/show/P1141

题目描述

有一个仅由数字 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 。

解题分析:
由于这题n的范围很大,如果直接bfs的话,可能会超时,所以要加一些优化,分析题目不难得到,每次搜索得到的联通块,它们的答案都相同,所以,一次搜索后,这个联通块中所有点的答案都已经求出来了,然后将答案保存即可

下次如果要查询这个点的答案,直接调用即可,不用再进行重复搜索。

#include <cstdio>
#include <queue>
using namespace std;
int n,m;
char map[][];int vis[][];
int color; int dir[][] = {,,,,-,,,-};
int ans[]; //最多可能有1000*1000个联通块 struct node
{
int x, y;
};
queue<node>q; bool juge(int x, int y)
{
if (x< || y< || x>n || y>n || vis[x][y])return true;
return false;
} void bfs(int r,int c)
{
node now, next;
now.x = r; now.y = c;
vis[r][c] = color; //不要忘记标记起点是属于第几个联通块
ans[color]++;
q.push(now);
while(!q.empty())
{
now = q.front();
q.pop();
for (int i = ; i < ; i++)
{
int xx = now.x + dir[i][];
int yy = now.y + dir[i][];
if (juge(xx, yy) || map[now.x][now.y] == map[xx][yy])continue;
vis[xx][yy] = color; ans[color]++; //ans记录序号为color的连通块的点的个数
//利用vis数组巧妙的将已经搜索过得连通块进行标记
next.x = xx, next.y = yy;
q.push(next);
}
}
} int main()
{
scanf("%d %d", &n, &m);
for (int i = ; i <= n; i++)
scanf("%s", map[i] + ); //注意这里要加1,因为map是从1开始存数据的
for (int i = ; i <= m; i++)
{
int x, y;
scanf("%d %d", &x, &y);
if (!vis[x][y]) {
color = i; //巧妙的利用染色的思想,将一个连通块中的所有的点赋一个共同的序号
while (!q.empty())q.pop(); //如果要进行bfs,那么要清空queue
bfs(x, y);
}
printf("%d\n", ans[vis[x][y]]);
}
return ;
}

2018-06-01

洛谷 P1141【BFS】+记忆化搜索+染色的更多相关文章

  1. FZU 2092 收集水晶 bfs+记忆化搜索 or 暴力

    题目链接:收集水晶 一眼看过去,觉得是普通的bfs,初始位置有两个.仔细想了想...好像如果这样的话..........[不知道怎么说...T_T] dp[12][12][12][12][210] 中 ...

  2. HDU 4444 Walk (离散化建图+BFS+记忆化搜索) 绝对经典

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4444 题意:给你一些n个矩形,给你一个起点,一个终点,要你求从起点到终点最少需要转多少个弯 题解:因为 ...

  3. FZU 2092 bfs+记忆化搜索

    晚上团队训练赛的题 和普通bfs不同的是 这是同时操纵人与影子两个单位进行的bfs 由于可能发生人和影子同时接触水晶 所以不可以分开操作 当时使用node记录人和影子的位置 然后进行两重for循环来分 ...

  4. [Swust OJ 409]--小鼠迷宫问题(BFS+记忆化搜索)

    题目链接:http://acm.swust.edu.cn/problem/409/ Time limit(ms): 1000 Memory limit(kb): 65535   Description ...

  5. luogu1514 [NOIp2010]引水入城 (bfs+记忆化搜索)

    我们先bfs一下看看是否能到最底下的所有点 如果不能的话,直接把不能到的那几个数一数就行了 如果能的话: 可以发现(并不可以)某格能到达的最底下的格子一定是一个连续的区间 (因为如果不连续的话,我们先 ...

  6. 【BZOJ 1415】 1415: [Noi2005]聪聪和可可 (bfs+记忆化搜索+期望)

    1415: [Noi2005]聪聪和可可 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1640  Solved: 962 Description I ...

  7. csu 最优对称路径(bfs+记忆化搜索)

    1106: 最优对称路径 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 371  Solved: 77[Submit][Status][Web Boar ...

  8. 【题解】洛谷P3953 [NOIP2017TG] 逛公园(记忆化搜索+SPFA)

    题目来源:洛谷P3953 思路 先用SPFA求一遍最短路 在求最短路的同时可以把所有点到终点的最短路求出来 dis数组 注意要反向SPFA  因为从起点开始可能会走到一些奇怪的路上导致时间负责度增加 ...

  9. 洛谷 2921 记忆化搜索 tarjan 基环外向树

    洛谷 2921 记忆化搜索 tarjan 传送门 (https://www.luogu.org/problem/show?pid=2921) 做这题的经历有点玄学,,起因是某个random题的同学突然 ...

随机推荐

  1. luogu P2680 运输计划

    传送门 要最长链的长度最短,一秒想到二分,因为如果对于某个长度满足改掉一边的边权后能使得所有链长度不超过该长度,则所有比他长的长度也满足. 二分最终答案.我们要使得原来长度大于二分的\(mid\)的链 ...

  2. C++11模板友元语法

    第 1 类: 普通类A的 普通类B 友元(一对一友好关系): 无需前置声明class B,当class B第一次出现在friend声明中时,该名字被隐式地认为可见. class A { friend ...

  3. Python 入门基础16 -- ATM + 购物车

    ATM + 购物车 1.需求分析 2.设计程序以及程序的架构 设计程序的好处: - 扩展性强 - 逻辑清晰 3.分任务开发 4.测试 黑盒: 白盒: 对程序性能的测试 5.上线运行 # Tank -- ...

  4. 数据库操作之整合Mybaties和事务讲解 5节课

    1.SpringBoot2.x持久化数据方式介绍          简介:介绍近几年常用的访问数据库的方式和优缺点 1.原始java访问数据库             开发流程麻烦           ...

  5. Linux分区设置

    基本3个就可以了 序号 路径 大小 格式 ① /boot 200MB ext4 ②   物理内存*1-1.5 swap ③ / 剩余存储空间 ext4

  6. 【转】Python之文件读写

    [转]Python之文件读写 本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 ...

  7. 从Linux内核中获取真随机数【转】

    转自:http://www.cnblogs.com/bigship/archive/2010/04/04/1704228.html 内核随机数产生器 Linux内核实现了一个随机数产生器,从理论上说这 ...

  8. 【译】.NET Core 2.2 Preview 2 发布

    原文出自.Net Blog Announcing .NET Core 2.2 Preview 2 今天,我们宣布推出.NET Core 2.2 Preview 2.我们有很多重要改进要和你分享,而且我 ...

  9. 通达OA批量处理没有结束但前台显示已经结束的流程

    问题描述: 通达OA系统出现大量流程没有结束,系统显示结束的问题 通过查询操作系统日志,数据库日志,包括程序日志没有发现异常,通过观察发现大量的流程结束时间都是在2016-02-16 17:32:XX ...

  10. java.lang.NoClassDefFoundError: com/google/inject/Injector

    报错如下: 解决方案: <dependency> <groupId>com.google.inject</groupId> <artifactId>gu ...