洛谷P1506 拯救oibh总部

题目背景

oibh总部突然被水淹没了!现在需要你的救援……

题目描述

oibh被突来的洪水淹没了>.<还好oibh总部有在某些重要的地方起一些围墙,用*号表示,而一个封闭的*号区域洪水是进不去的……现在给出oibh的围墙建设图,问oibh总部没被淹到的重要区域(由"0"表示)有多少。

输入格式

第一行是两个数,x和y(x,y<=500)

第二行及以下是一个由*和0组成的x*y的图。

输出格式

输出没被水淹没的oibh总部的“0”的数量。

输入输出样例

输入 #1

样例输入1
4 5
00000
00*00
0*0*0
00*00

样例输入2
5 5
*****
*0*0*
**0**
*0*0*
*****

输出 #1

样例输出1
1

样例输出2
5

思路:

将输入用二维数组存储,起点是a[1][1],然后将整个总部用‘0’围起来,从a[0][0]开始进行广度优先搜索,这样洪水就能从外面一层一层的将能淹没到的地方淹没,最后搜索完,只剩下没被淹没的重要区域(用‘0’表示),此时只需要对整个数组遍历,然后计数即可。参考代码如下:

参考代码:

#include 
using namespace std;
int a[505][505];
int x,y;
int d[4][2]={0,1,0,-1,1,0,-1,0};
struct node{
    int r,c;//存储坐标
}p;
int num=0;
//广度优先搜索
void bfs(){
    p.r=p.c=0;
    queue q;
    q.push(p);
    while(!q.empty()){
        node f=q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int dx=f.r+d[i][0];
            int dy=f.c+d[i][1];
            if(dx>=0 && dx<=x+1 && dy>=0 && dy<=y+1 && a[dx][dy]==0){
                a[dx][dy]=1;
                node m1;
                m1.r=dx;
                m1.c=dy;
                q.push(m1);
            }
        }
    }
}

int main(){
    cin >> x >> y;
    char c;
    for(int i=1;i<=x;i++)
        for(int j=1;j<=y;j++){
            cin >> c;
            if(c=='0')
                a[i][j]=0;
            else
                a[i][j]=1;
    }
    bfs();
    for(int i=1;i<=x;i++){
        for(int j=1;j<=y;j++){
            if(a[i][j]==0)
                num++; 
        }
    }
    cout << num << endl;
    return 0;
}

 

你可能感兴趣的:(数据结构,广度优先搜索模板)