题目链接: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. spring boot + es

    用Elasticsearch构建电商搜索平台 refs: http://www.sojson.com/blog/176.html

  2. F - New Distinct Substrings (后缀数组)

    题目链接:https://cn.vjudge.net/contest/283743#problem/F 题目大意:给你一个字符串,然后让你求出不同的子串的个数. 具体思路:首先,一个字符串中总的子串个 ...

  3. python - class类 (三) 类的组合

    类的组合: #组合 class A1(): def pr(self): return 'a1' class A2(): def pr(self): return 'a2' class A3(): de ...

  4. Activity,Fragment的状态保存

    http://blog.csdn.net/hqdoremi/article/details/26376797 https://blog.csdn.net/u013588712/article/deta ...

  5. IOS中的用户安全

    用户安全: 原则:在网络传输过程中,关于用户的密码是不能传递明文的,需要通过加密之后进行传递, 一般采用的加密技术是: (1)md5+盐 (2)hmac+md5 (3)hmac+md5+时间戳   这 ...

  6. Simulink--MATLAB中的一种可视化仿真工具

     Simulink是MATLAB中的一种可视化仿真工具, 是一种基于MATLAB的框图设计环境,是实现动态系统建模.仿真和分析的一个软件包,被广泛应用于线性系统.非线性系统.数字控制及数字信号处理的建 ...

  7. kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 【转】

    转自:http://blog.chinaunix.net/uid-26349264-id-4455634.html 目录 kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 ...

  8. mac安装pyspider报错

    (env)$ pip3 uninstall pycurl (env)$ pip3 install --upgrade pip (env)$ export LDFLAGS=-L/usr/local/op ...

  9. win32编程:L,_T() ,TEXT和_TEXT

    L的使用: 在字符串前面的大写字母L,用来告诉编译器该字符串应该作为Unicode来编译.它用来将ASNI转换为Unicode,Unicode字符串中每个字符占16位(两个字节),而在ASNI中每个字 ...

  10. 使用rpm包安装lamp环境

    前提: 是你的centos能联网,或者有本地的yum仓库 或者配置通过代理上网 vim /etc/yum.conf 加入如下内容 proxy=http://192.168.11.82:808 1.通过 ...