01迷宫题解(bfs,联通块)
题目https://www.luogu.org/problemnew/show/P1141
这个题解主要针对我个人出现的一些问题和注意的地方。
解题思路
首先说一下联通块
联通块这个比较抽象,举个例子就是假设一条鱼在一个池塘里游泳,那么在时间不限的情况下,小鱼会游过池塘的所有位置,而这个与小鱼的出发点是无关的。
所以在本题中,假设从一个坐标开始,对他能经过的所有点进行标记,那么在剩下的询问中,如果询问的坐标已经被标记,那么它所经过的点与假设的坐标是相同的,所以就可以创建一个统计格子数目的数组cnt和一个联通图int数组_map与迷宫的坐标一一对应,假设第i次询问可以经过n个点,那么就把这个联通图所有经过的点赋值为i,并赋值cnt[i]=经过的格子数。在剩下的询问中,如果已经被标记,则直接输出_map对应的i所对应的cnt数组的值。
我本人出现的错误(一直不知道哪里错了,看了很长时间才反应过来)
一开始并没有使用_map作为联通图,而是直接在原迷宫内修改,但是在询问过多的情况下,两位数的值就不能赋值在一个位置中(当时不知道为什么这么写,有点懵),所以在情况超过9次之后就会出错。具体怎么个情况就是代码中注释的部分。
说明:
我的bfs可能比较复杂,个人习惯,但是觉得理解起来还是比较方便。
完整代码
#include <iostream>
#include<deque>
#include<queue>
#include<stdio.h>
#define CHECK(x, y) (x<wx && x>=0 && y >=0 && y<hy)
using namespace std;
int dir[][]={{-,},{,},{,-},{,}};
char room[][];
int wx,hy,num,cnt[],way;
int _map[][];
struct node {int x,y;};
int bfs(int dx,int dy)
{
num=;
queue<node> q;
node start,next;
start.x=dx;
start.y=dy;
q.push(start);
while(!q.empty())
{
start=q.front();
q.pop();
if(room[start.x][start.y]==''||room[start.x][start.y]=='#')
{
//room[start.x][start.y]='0'+way;
room[start.x][start.y]='*';
_map[start.x][start.y]=way;
for(int i=;i<;i++)
{
next.x=start.x+dir[i][];
next.y=start.y+dir[i][];
//cout<<next.x<<" "<<next.y<<endl;
if(CHECK(next.x,next.y)&&room[next.x][next.y]=='')
{
num++;
room[next.x][next.y]='.';
q.push(next);
}
}
}
else if(room[start.x][start.y]==''||room[start.x][start.y]=='.')
{
//room[start.x][start.y]='0'+way;
room[start.x][start.y]='*';
_map[start.x][start.y]=way;
for(int i=;i<;i++)
{
next.x=start.x+dir[i][];
next.y=start.y+dir[i][];
//cout<<next.x<<" "<<next.y<<endl;
if(CHECK(next.x,next.y)&&room[next.x][next.y]=='')
{
num++;
room[next.x][next.y]='#';
q.push(next);
}
}
}
//cout<<"size="<<q.size()<<" "<<num<<endl;
}
return num;
}
int main()
{
int n,m,dx,dy;
cin>>n>>m;
wx=hy=n;
for(int i=;i<n;i++)
cin>>room[i];
for(way=;way<=m+;way++)
{
cin>>dx>>dy;
dx=dx-;
dy=dy-;
if(room[dx][dy]==''||room[dx][dy]=='')
cnt[way]=bfs(dx,dy);
//cout<<cnt[room[dx][dy]-'0'];
printf("%d\n",cnt[_map[dx][dy]]);
//for(int i=0;i<n;i++)
//cout<<room[i]<<endl;
}
return ;
}
01迷宫题解(bfs,联通块)的更多相关文章
- 洛谷P1141 01迷宫【bfs】
题目链接:https://www.luogu.org/problemnew/show/P1141 题意: 有一个填了0和1的n*n的格子,只能0走到1,1走到0 有m组询问(数据量是1e5),问某一个 ...
- 洛谷 p1141 01迷宫题解
很长时间没发博客了,今天水一下 很多dalao说染色(普通的)过不了, 我怎么就过了 其实我也是今天才知道什么是染色(由@你听风在吼 dalao指导) 然后自己打了一个,也不知道叫不叫染色,反正是过了 ...
- [洛谷Luogu]P1141 01迷宫[联通块 并查集]
题目链接 大致题意 相邻格子不同为连通,计算每个点所在的连通块大小. 想法 我采用了并查集的做法. 开一个辅助数组记录连通块大小,每次合并的时候更新父亲节点的大小即可. 一个点先与它上面的点判定,若判 ...
- 01迷宫 BFS
题目描述 有一个仅由数字000与111组成的n×nn \times nn×n格迷宫.若你位于一格0上,那么你可以移动到相邻444格中的某一格111上,同样若你位于一格1上,那么你可以移动到相邻444格 ...
- 链表加bfs求补图联通块
https://oj.neu.edu.cn/problem/1387 给一个点数N <= 100000, 边 <= 1000000的无向图,求补图的联通块数,以及每个块包含的点数 由于点数 ...
- 分别利用并查集,DFS和BFS方法求联通块的数量
联通块是指给定n个点,输入a,b(1<=a,b<=n),然后将a,b连接,凡是连接在一起的所有数就是一个联通块: 题意:第一行输入n,m,分别表示有n个数,有输入m对连接点,以下将要输入m ...
- P1141 01迷宫
https://www.luogu.org/problemnew/show/P1141 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样 ...
- 【u115】&&【t031】 01迷宫
01迷宫(maze01) Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相 ...
- 01迷宫 洛谷 p1141
题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫, ...
随机推荐
- react native学习资料
一:基础学习: react-native中文文档(react native中文网,人工翻译,官网完全同步)http://react-native.cn/docs/getting-started.htm ...
- spring boot(8)-mybatis三种动态sql
脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...
- Linux工具-nmon
1.nmon下载地址:https://sourceforge.net/projects/nmon/files/ 创建文件nmon:# mkdir nmon 解压文件夹:# tar -zxvf nmon ...
- asp.net mvc4 小问题
最近在学习mvc4中间出现一些问题.留作记录.. 1.新建立的项目在vs2013中运行后会出现一个长轮询..这个叫browserLink 是vs2013中新加入的东西.至于更多解释.直接百度.. 关闭 ...
- jQuery 小案例
用jquery实现 百度换肤的模式; <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- [翻译] DoActionSheet
DoActionSheet https://github.com/donobono/DoActionSheet An replacement for UIActionSheet : block-bas ...
- 细嚼慢咽C++primer(4)——类(1):构造函数,类型别名
1 最简单地说,类即使定义了一个新的类型和一个新的作用域. 2 基础 1 构造函数 构造函数一般应使用一个构造函数初始化列表,来初始化对象的数据成员. Sales_item(): units_s ...
- C++类知识总结
c++类 1.初始化const或引用类型数据成员的唯一机会是在构造函数初始化列表中. 2.使用成员初始化列表时成员初始化的次序:第一个成员首先被初始化.然后是第二个,依次类推. 构造函数初始化列表为类 ...
- C# 委托/Func() 中 GetInvocationList() 方法的使用 | 接收委托多个返回值
在日常使用委托时,有以下常用方法 方法名称 说明 Clone 创建委托的浅表副本. GetInvocationList 按照调用顺序返回此多路广播委托的调用列表. GetMethodIm ...
- 沉淀再出发:jetty的架构和本质
沉淀再出发:jetty的架构和本质 一.前言 我们在使用Tomcat的时候,总是会想到jetty,这两者的合理选用是和我们项目的类型和大小息息相关的,Tomcat属于比较重量级的容器,通过很多的容器层 ...