看似普通的 bfs 题(实际上也不怎么难 主要是我太菜了)

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

如果直接用简单的bfs一顿求的话,会超时(别问我为什么 因为我一开始就是这么写的)

超时的代码就不贴了

所以这里就需要求它的连通块

大体思路是:

先遍历每一个点,如果这个点已经标记了连通块就不管他,如果没有标记的话就进行一次bfs 直到所有的点都标记了自己所在的连通块(这个连通块可能只有一个点)

然后对于输入的每一次查询 直接输出已经标记好的连通块所包含的点数就好了!

这样只需要一次计算,之后都是对标记连通块的数组进行访问 效率大大提升了!

具体实现:

#include<bits/stdc++.h>

using namespace std;

int n,m,a[][]={,,-,,,,,-},flag[][],ans[];
char maps[][]; void bfs()
{
int d=; //这里一定要从1开始 不能是0!!不然会死循环......
int i,j;
for(i=;i<=n;i++)
for(j=;j<=n;j++)
{
if(flag[i][j]==) //如果还没有判断
{
flag[i][j]=d; //记录连通块的标号
int num=;
queue <int> q; //每次bfs都要开一个新的queue,因为c++的queue没有置空函数
q.push(i);
q.push(j);
while(!q.empty()) //简单的bfs....
{
int tx,ty,x,y;
x=q.front();
q.pop();
y=q.front();
q.pop();
for(int t=;t<;t++)
{
tx=x+a[][t];
ty=y+a[][t];
if(maps[tx][ty]!=maps[x][y]&&tx>=&&tx<=n&&ty>=&&ty<=n&&flag[tx][ty]==) //这里一定要写&&flag[tx][ty]==0!!我本来以为不需要,但是仔细想想就知道了....
{
flag[tx][ty]=d; //标记成同一个连通块
num++; //连通块个数+1
q.push(tx);
q.push(ty);
}
}
}
ans[d]=num; //记录当前标号的连通块所包含的点的个数
d++; //更新标号
}
}
} int main()
{
int i,j,a,b;
cin>>n>>m;
for(i=;i<=n;i++)
for(j=;j<=n;j++)
cin>>maps[i][j];
bfs();
for(i=;i<m;i++)
{
cin>>a>>b;
cout<<ans[flag[a][b]]<<endl;
} }

这个题耗了我这么久时间 还是我太菜了......快要校赛了 一定要好好学习!!

洛谷 P1141 01迷宫的更多相关文章

  1. 洛谷——P1141 01迷宫

    P1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任 ...

  2. 洛谷P1141 01迷宫

    题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫, ...

  3. 洛谷P1141 01迷宫【DFS】

    有一个仅由数字00与11组成的n \times nn×n格迷宫.若你位于一格0上,那么你可以移动到相邻44格中的某一格11上,同样若你位于一格1上,那么你可以移动到相邻44格中的某一格00上. 你的任 ...

  4. 洛谷P1141 01迷宫【bfs】

    题目链接:https://www.luogu.org/problemnew/show/P1141 题意: 有一个填了0和1的n*n的格子,只能0走到1,1走到0 有m组询问(数据量是1e5),问某一个 ...

  5. 洛谷 - P1141 - 01迷宫 - dfs

    https://www.luogu.org/problemnew/show/P1141 能互相到达的格子的答案自然是一样的,第一次dfs标记联通块,第二次dfs把cnt传递到整个联通卡并顺手消除vis ...

  6. 洛谷 p1141 01迷宫题解

    很长时间没发博客了,今天水一下 很多dalao说染色(普通的)过不了, 我怎么就过了 其实我也是今天才知道什么是染色(由@你听风在吼 dalao指导) 然后自己打了一个,也不知道叫不叫染色,反正是过了 ...

  7. 洛谷P1238 走迷宫

    洛谷1238 走迷宫 题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个 ...

  8. luogu P1141 01迷宫 x

    P1141 01迷宫 题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任 ...

  9. 01迷宫 洛谷 p1141

    题目描述 有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上. 你的任务是:对于给定的迷宫, ...

随机推荐

  1. Python 字典一个易犯的错误

    一个易犯的错误,关于 Python 的传值(对于不可变量) 和 传引用(对于可变量),浅拷贝和深拷贝.废话不多说,看例子, 直接改变可变字典值,失败, >>> dic = dict. ...

  2. 关于tomcat启动报“this web application instance has been stopped already”的处理

      出现情况1            启动tomcat的时候,默认会启动这个“/tomcat/webapps/ROOT”路径下的tomcat自带的程序包,当启动这个路径下的程序包后,如果tomcat扫 ...

  3. BZOJ1023 SHOI2008 仙人掌图 仙人掌、单调队列

    传送门 求仙人掌的直径,可以由求树的直径进行拓展,只需要在环上特殊判断. 沿用求树的直径的DP,对于一条不在任何环内的边,直接像树的直径一样转移,然后考虑环的影响. 设环长为\(cir\),在\(df ...

  4. web安全:通俗易懂,以实例讲述破解网站的原理及如何进行防护!如何让网站变得更安全。

    本篇以我自己的网站为例来通俗易懂的讲述网站的常见漏洞,如何防止网站被入侵,如何让网站更安全. 要想足够安全,首先得知道其中的道理. 本文例子通俗易懂,主要讲述了 各种漏洞 的原理及防护,相比网上其它的 ...

  5. Php7 开发笔记

    Ubuntu环境安装 http://www.jianshu.com/p/1d312d9f1be1 sudo apt-get install python-software-properties sof ...

  6. NFV论文集(二)

    一 文章名称:VNF Placement with Replication for Load Balancing in NFV Networks 发表时间:2017 期刊来源:ICC: IEEE In ...

  7. 第十二届湖南省赛G - Parenthesis (树状数组维护)

    Bobo has a balanced parenthesis sequence P=p 1 p 2…p n of length n and q questions. The i-th questio ...

  8. iOS开发造轮子 | 通用占位图

    https://www.jianshu.com/p/beca3ac24031 实际运用场景: 没网时的提示view,tableView或collectionView没内容时的展示view,以及其它特殊 ...

  9. adb通过wifi连接android设备

    问题背景 近期的项目测试中,需要将移动设备与厂商机器进行usb连接视频传输(投屏).测试过程中需要定位问题,经常需要查看实时日志,移动设备已经和厂商机器usb连接投屏,无法用usb连接到PC,那么有什 ...

  10. vue传参

    <template> <ul> <li v-for="item in list" :key="item.id"> <b ...