毫无意义的前言

我的蒟蒻之路终于走到了搜索这一关!经历了深搜懵逼后来到了广搜懵逼态。广搜第一题就卡了我一天。。。各位巨佬们别笑,是真的。。。算法的理解从1到2很容易,但是从0到1很难。了解BFS(广搜)还要顺带着了解队列什么的。。。就用这道题纪念我的广搜历程吧,希望能帮到有困难有需要的人。同时抛砖引玉,如果其他做法欢迎在评论区讨论。

真希望我C++不要从入门到入土233333

题目

问题 A: 面积(你看真的是第一道题吧!)

时间限制: 1 Sec  内存限制: 128 MB

题目描述

编程计算由“*”号围成的下列图形的面积。面积计算方法是统计*号所围成的闭合曲线中水平线和垂直线交点的数目。如下图所示,在10*10的二维数组中,有“*”围住了15个点,因此面积为15。

0  0  0  0  0  0  0  0  0  0

0  0  0  0  *  *  *  0  0  0

0  0  0  0  *  0  0  *  0  0

0  0  0  0  0  *  0  0  *  0

0  0  *  0  0  0  *  0  *  0

0  *  0  *  0  *  0  0  *  0

0  *  0  0  *  *  0  *  *  0

0  0  *  0  0  0  0  *  0  0

0  0  0  *  *  *  *  *  0  0

0  0  0  0  0  0  0  0  0  0

样例输入

0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 0 0 0
0 0 0 0 1 0 0 1 0 0
0 0 0 0 0 1 0 0 1 0
0 0 1 0 0 0 1 0 1 0
0 1 0 1 0 1 0 0 1 0
0 1 0 0 1 1 0 1 1 0
0 0 1 0 0 0 0 1 0 0
0 0 0 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0

样例输出

15

分析

(可以跳过)

输入特别贴心地帮我们把“*”变成了‘1’。但是这题的难点在于橘0与绿0都是0,怎样才能知道哪些0是我们要用的呢?

可以用一个vis数组储存状态。不要的0用2代替掉,要计数的0还是0。最后矩阵再扫一遍扫出0的数量即可。

定义:

  • jz用来存矩阵
  • vis存状态
  • xc,yc表示搜索的方向,他们是组合作战的!比如看到xc[0],yc[0]组合在一起就是“行+=-1,列+=0”的意思,也就是命令某个坐标“往上搜!”(关于“专门存一个方向数组”的方法,在我的 【c++细菌的繁殖与扩散】毒瘤题目的题解与说明这篇博客中有做过详细说明,不懂的孩纸可以去看一下( • ̀ω•́ )✧)
  • BFS经常用到队列的思想,我这里没有用C++的队列函数(本蒟蒻还不太会用),而是用结构体hhh实现队列,用qwq数组去存这些结构体。(虽然我会提一点队列的用法但还是自己去稍微了解一下队列的知识比较好( ̄▽ ̄)~*)
  • 题目给出了矩阵是10*10的,但开大一点比较好。。。

搜索判断没用的0:

我在洛谷看相关题目的题解时看到了一些搜索方法。选择一个开始搜索的点比较重要。不少人要把矩阵的四个角特判(我没看懂为什么四个角要特判求评论区告知)。所以我自己用的是“把整个矩阵外面包一圈1”的方法。这样只要从一个角开始搜就可以了。

emmm,那么为什么要在外面包一圈1呢?

主要是为了偷懒(好吧其实也偷不了多少懒)

先包一圈给你看吧

代码实现:

如果你没有包,你得打上一堆判断条件确保你搜索时不会出界,像这样:

并且要从四个角特判一下:

当然这个方法用不用凭个人喜好来,我觉得包一圈1简单粗暴不用担心搜出界ヾ(=・ω・=)o

我们从10*10矩阵的第一个开始搜(只要任意一个角都可以)。注意是说的是10*10的矩阵而不是我们包了一圈后12*12的矩阵,因为外面包的那一圈已经被标记为“1”,不用再去搜“栅栏”了。

进入BFS函数:

给head(队首),tail(队尾)附上初值=1,此时因为队列里空空如也,所以队首=队尾=1,这个1就表示当前扫到第1个了的意思

由题可以发现封闭图形的外围不会在矩阵的边缘处(否则怎么封闭,并且这样我们在外面包一圈1也会产生很多新的封闭图形)。所以就可以放心地给第一个点打上“2”的标记了(第一个点必为没用的0)。我的意思大概是这样的:

把起始点的坐标入队————>

tail++表示有新的成员要入队所以队列要扩容(也就是往下搜索新坐标并加入队列),head++则表示由于进入了新队员所以(排在最前面的)旧队员要被赶出去(搜过的坐标没用了就出队)

所以当head<tail时,就表示队伍里仍存在队员,搜索还在继续。我们通常用这个做为搜索循环的条件。无论是否有扫到没用的0,队首的成员都要依次出队,直到head>tail

x=qwq[head].h;
y=qwq[head].l;
head++;//搜到了下一个坐标后,上一个出队

每次搜到了新坐标后别忘了赋值给x和y!(在当前新坐标就是出发点)

现在枚举这个坐标的四个方向来广搜第一层,通过判断我们发现只能走两个方向(只枚举了前5*5的格子哈)

满足条件后,标记,入队

继续扫~直到。。。

接着只要在主函数里扫描一遍,扫到“0”(白色部分)就++计数器,输出计数器的值就是正确答案了~

代码。

#include<bits/stdc++.h>
using namespace std;
int jz[50][50],vis[50][50],ans,xc[4]= {-1,1,0,0},yc[4]= {0,0,-1,1};
struct hhh
{int h,l;
} qwq[2500];
void bfs(int x,int y)
{//if(vis[x][y])return;int head=1,tail=1;jz[x][y]=2;vis[x][y]=1;qwq[tail].h=x;qwq[tail].l=y;tail++;while(head<tail){x=qwq[head].h;y=qwq[head].l;head++;for(int i=0; i<4; i++){if((!vis[x+xc[i]][y+yc[i]])){qwq[tail].h=x+xc[i];qwq[tail].l=y+yc[i];jz[x+xc[i]][y+yc[i]]=2;vis[x+xc[i]][y+yc[i]]=1;tail++;}}}
}
int main()
{for(int i=1; i<=10; i++){for(int j=1; j<=10; j++){cin>>jz[i][j];if(jz[i][j]==1)vis[i][j]=1;}}for(int i=0; i<=11; i++)for(int j=0; j<=11; j++){if(!i||i==11) jz[i][j]=1,vis[i][j]=1;if(!j||j==11)    jz[i][j]=1,vis[i][j]=1;}bfs(1,1);for(int i=1; i<=10; i++){for(int j=1; j<=10; j++){if(jz[i][j]==0)    ans++;}}cout<<ans<<endl;return 0;
}

谢谢阅读,做的我好累。。。。╰(:з╰∠)_

【C++广度搜索入门】面积相关推荐

  1. 二叉树的前序中序后序递归查找,深度,广度搜索C++实现(VS2017)

    一.图和运行结果如下 二.代码如下: #include<iostream> #include<string> #include<fstream> #include& ...

  2. 深度搜索问题c语言,C语言实现的图的深度搜索与广度搜索程序.doc

    C语言实现的图的深度搜索与广度搜索程序 C语言实现的图的深度搜索与广度搜索程序 /* 上机试验5-图的建立和遍历 1)建立[无向][非连通]图的邻接表存储结构,要求顶点个数不少于15个. 2)用DFS ...

  3. FatMouse and Cheese HDU - 1078(记忆化搜索入门模板)

    题意: n * n的正方形格子(每个格子均放了奶酪),老鼠从(0,0)开始,每次最多移动k步,可以选择上下左右四个方向移动,下一个移动点奶酪块数量必须要大于当前点. 整理模板ing- 题目: FatM ...

  4. 地图分析--广度搜索

    问题来源:地图分析 问题描述:你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了.其中 0 代表海洋,1 代表陆地,你知道距离陆地 ...

  5. 【算法】深度搜索(DFS) 和 广度搜索(BFS)

    深度搜索(DFS) 点:然后退回到该顶点,搜索其它路径,直到以该顶点为始点的所有路径的顶点都被访问,深度搜索算法是递归算法,因为对于没一个节点来说,执行的是同样的操作.  简单来说,深度搜素算法就是一 ...

  6. 深度搜索(DFS)和广度搜索(BFS)

    深度搜索(DFS) 一.搜索方法:  沿出发顶点的第一条路径尽量深入,遍历路径上所有顶点:然后退回到该顶点,搜索其它路径,直到以该顶点为始点的所有路径的顶点都被访问,深度搜索算法是递归算法,因为对于没 ...

  7. 【数据结构】无向图的遍历(广度搜索和深度搜索)

    说明 以邻接表作为存储结构 以用户指定的结点分别进行广度搜索和深度搜索 相应的生成树的边集 运行截图 源代码 import java.util.*;public class AdjacencyList ...

  8. 深度搜索和广度搜索特点的深刻理解

    问题提出: 考虑如下图所示的简单图所表示的缅因州的道路系统.在冬天里保持道路通路通畅的唯一方式就是经常扫雪.高速公路部分希望只扫尽可能少的道路上的雪,而确保总是存在连接任何两个乡镇的干净道路.如何才能 ...

  9. 人、狼、羊、白菜过河问题(广度搜索)

    人.狼.羊.白菜过河问题(广度搜索) 大家好,我是小白莲,今天小白莲给大家分享的是广度搜索的应用之人.狼.羊.白菜过河问题,相信大家在小时候都听过这个有趣的思考题,没听过也没关系,大概是这样的: 初始 ...

最新文章

  1. Spring.NET教程(二十)——整合Quartz.NET(应用篇)
  2. JS高级——错误处理
  3. 2017.10.22 诸神眷顾的幻想乡 失败总结
  4. git bash linux 命令,Git Bash的妙用 - 使用Linux命令
  5. 如果访问设备屏幕宽度小于1024,跳转到移动端
  6. vuex的计算属性_vue中vuex的五个属性和基本用法
  7. Android Studio NDK报错:mips64el-linux-android-strip 找不到
  8. 如何将数据库中的表导入到PowerDesigner
  9. 前程无忧岗位数据爬取+Tableau可视化分析
  10. 特征值与特征向量及其应用
  11. 如何测试短信验证码平台的安全和实用性?
  12. 浅谈临床研究中随机化
  13. HTML篇三——(1)
  14. 怎么用photoshop抠图,得到透明图片,填充颜色,得到一个程序透明图标
  15. 国内离线安装 Chrome 扩展程序的方法总结
  16. 原生JS实现雪花飘落的效果
  17. 终年32岁的传奇数学家,生前寂寂无闻,一个世纪后却让硅谷领袖们集体落泪致敬
  18. 华为手机Android系统优缺点,华为手机与iPhone相比有哪些优缺点?
  19. grep多关键词查询
  20. 搞IT的应届生如何写好简历?

热门文章

  1. Position属性值的相关解析
  2. 1998-2018年:统治网络的20家互联网巨头
  3. 阿里云被挖矿使用,导致cpu长期处于100%,ddgs进程,xWx3T进程,关于redis密码
  4. 20200329——剑指offer 面试题49:丑数
  5. java epson_无法与Epson POS打印机通信
  6. 汇编程序语言 输入数字n和n个数字并对n个数字排序(带注释)
  7. 【转】C 语言吧 · 问题资料大全【转】
  8. Java 面向对象 之 抽象类 abstract
  9. 量子物理 薛定谔的猫
  10. 计算机取证勘察箱工具构成研究