题目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 ;
}

最新文章

  1. 调试WEB APP多设备浏览器
  2. Lua windows环境搭建
  3. 使用SimpleXML应该注意的问题有哪些?
  4. [转载]SAP BASIS学习手册
  5. c# 调用 ShellExecute
  6. Web通信之:长轮询(long-polling)(转)
  7. A geometric interpretation of the covariance matrix
  8. 承诺消费换4G无线上网伴侣活动火热来袭,各指定营业厅即可办理
  9. CSS: 解决Div float后,父Div无法高度自适应的问题
  10. 安装用户脚本的福音:Tampermonkey(油猴)
  11. [刷题]算法竞赛入门经典(第2版) 5-5/UVa10391 - Compound Words
  12. Linxu服务器上安装JDK小白教程
  13. Linux- 常用命令, Vim编辑器操作
  14. 关于表单元素的name及HTML中的id
  15. css属性应用bug大杂烩(后续继续更新)
  16. 【python练习题】程序8
  17. 20165223 实验四 Android开发基础
  18. Python_xml
  19. IDEA控制台问题:At least one JAR was scanned for TLDs yet contained no TLD
  20. Lua require 相对路径

热门文章

  1. C++笔记(1)----此运算符函数的参数太多
  2. 如何从只会 C++ 语法的水平到达完成项目编写软件的水平?
  3. 毕向东_Java基础视频教程第19天_IO流(20~22)
  4. 小程序填坑之路(二):cover-view
  5. SQL点点滴滴_公用表表达式(CTE)递归的生成帮助数据
  6. BufferedInputStream使用详解
  7. 无法安装64位office,因为已有32位版本怎么办
  8. Linux系统下安装Redis和Redis集群配置
  9. December 09th 2016 Week 50th Friday
  10. Spring Security 静态资源访问