当前位置 博文首页 > 文章内容

    LQB201808全球变暖 bfs

    作者: 栏目:未分类 时间:2020-07-12 14:00:58

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



     

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<stdlib.h>
     4 #include<time.h>
     5 #include <queue>
     6 using namespace std;
     7 int N,ans=0;
     8 int ax[4]={0,0,1,-1};
     9 int ay[4]={1,-1,0,0};
    10 //bfs队列加对象,对象就是队列的类型,在这个题中就可以直接用x,y
    11 //满足条件(为#)的对象插入队列
    12 struct Point{
    13     int x;
    14     int y;
    15 };
    16 queue<Point> q;
    17 //标记是否到达
    18 int mark[100][100]={0};
    19 char data[100][100];
    20 
    21 
    22 void bfs(int i,int j){//bfs的返回值设为void 是因为你可以把它要更改的全部数据设置为全局变量
    23     //首次进来标记为已访问,并且要插入队列
    24     mark[i][j]=1;
    25     q.push({i,j});
    26     int cnt1=0;
    27     int cnt2=0;
    28     while(!q.empty()){//这里是循环,直到队列为空.所以其实bfs函数就执行了一次
    29         Point first=q.front();//取头
    30         q.pop();//弹出
    31         cnt1++;
    32         bool bound=false;//标记其是否有#,因为有一个#就可以判断沉了
    33         for (int k = 0; k < 4; ++k) {
    34             int x=first.x+ax[k];
    35             int y=first.y+ay[k];//这个地方一开始写错.注意是取的first的两个量在改变而不是ij
    36             //对每一个位置,判断是否越界以及是哪种字符
    37             if(x>=0 && x<N && y>=0 && y<N && data[x][y]=='.')//本未是否可行
    38                 bound =true;
    39             if(x>=0 && x<N && y>=0 && y<N && data[x][y]=='#' && mark[x][y]==0){//周围有没有可以放在队列里的
    40                 q.push({x,y});
    41                 mark[x][y]=1;//一开始忘记了,注意标注
    42             }
    43         }
    44         if(!bound) {
    45             cnt2++;
    46 
    47         }
    48 
    49     }
    50     ans=cnt2;
    51    // cout<<cnt2<<endl;
    52 
    53 
    54 }
    55 int main(){
    56     cin>>N;
    57     for (int i = 0; i < N; ++i) {
    58         for (int j = 0; j < N; ++j) {
    59             cin>>data[i][j];
    60 
    61         }
    62 
    63     }
    64     for (int i = 0; i < N; ++i) {
    65         for (int j = 0; j < N; ++j) {
    66 
    67             if (data[i][j] == '#' && mark[i][j] == 0) {
    68                 bfs(i,j);
    69 
    70                // cout << i<<" "<<j<<endl;
    71                 //bfs(i,j);//所有的都要遍历,防止孤零零一个#被卡出来
    72             }
    73 
    74         }
    75     }
    76 
    77 
    78 
    79 cout<<ans;
    80 
    81 }

    bfs连通块问题,,,,,

    如果是要求有几个连通块就是进bfs()了几次

    如果需要进行标记就是用全局变量

     

    队列里的循环:

    先取头去头,

    然后对头进行四个方向的判断:

    1.是否可以加入队列(一定要注意边界,有些题边界是可以加入队列的,比如这个题.但这个题限制不可能在边界了呜呜呜,一开始错了耗了好久)

     

    2.是否满足条件.

     

    只有加入队列才有资格判断是否满足条件.

     

     

    注意一个技巧就是queue放入的对象是一个结构体.