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上. 你的任务是:对于给定的迷宫, ...
随机推荐
- 已注册成Portal联合服务器的Server,如何修改机器名?
1.产品版本 ArcGIS for Server 10.2.2 2.修改说明 本环境中,Portal for ArcGIS和ArcGIS for Server两个产品安装在同一台机器上.安装前已将完全 ...
- Google APAC----Africa 2010, Qualification Round(Problem C. T9 Spelling)----Perl 解法
原题地址链接:https://code.google.com/codejam/contest/351101/dashboard#s=p2 问题描述: Problem The Latin alphabe ...
- Java快速入门-04-Java.util包简单总结
学Java的程序员,lang包和util包最好是要过一遍的. 建议大家都序下载一个离线版开发文档,查阅非常方便,我给大家提供一个中文版 jdk1.8 离线文档,查看:JAVA - JDK 1.8 AP ...
- git中常见操作指令
从git上拉下一个项目: 1.git clone 项目链接 2. git checkout development (切换到development分支) ...
- IDEA Properties中文unicode转码问题
在IDEA中创建了properties文件,发现默认中文不会自动进行unicode转码.如下 在project settings - File Encoding,在标红的选项上打上勾,确定即可 效果图 ...
- Java实例---简单的宠物管理系统
代码分析 Cat.java package com.ftl.petshop; class Cat implements Pet { private String name; private Strin ...
- C# 委托/Func() 中 GetInvocationList() 方法的使用 | 接收委托多个返回值
在日常使用委托时,有以下常用方法 方法名称 说明 Clone 创建委托的浅表副本. GetInvocationList 按照调用顺序返回此多路广播委托的调用列表. GetMethodIm ...
- [COGS 0407][NOIP 2009] 靶形数独
407. [NOIP2009] 靶形数独 ★★ 输入文件:sudoku.in 输出文件:sudoku.out 简单对比时间限制:5 s 内存限制:128 MB [问题描述] 小城和小华 ...
- 结构类型:Struct
一.概述: 结构类似于类,但结构为值类型,存储于栈中. 结构不能继承和被继承,但可实现接口. 结构成员访问级别有public,private(默认) ,internal. 1.简单结构 可以将无方法, ...
- 020.1.1 collections集合工具类
内容:常见需求以及使用—逆转比较器顺序,最值和同步方法 collections类的方法都是静态方法 强行逆转比较器的顺序例子: //##主函数.java List<String> list ...