信息学奥赛一本通 滴 1249_Lake Counting!

Hi!又是窝!

还是一个例题带你康康广搜咯~

老样纸!

读题!

题意:  有一块N×M的土地,雨后积起了水,有水标记为‘W’,干燥为‘.’(英文句号)                              八连通的积水被认为是连接在一起的                           请求出院子里共有多少水洼?

输入:

第一行为N,M(1≤N,M≤110)

下面是N*M的土地示意图

输出:

一行,共有的水洼数

看看程序叭

#include<bits/stdc++.h>//万能头 
#include<queue>// 如果不能用万能头就要单独写一个这个它能启用队列这个什么 
using namespace std;
const int N=1e2+10;
char a[N][N];// 定义一个char类型的 a数组,用来存储
bool vis[N][N];// 定义一个bool类型的vis数组,用来标记 
int n/*行*/, m/*列*/, ans/*计数*/;

struct point{
    int x, y;// 定义结构体变量 
};

int dx[]={0,0,1,-1,1,1,-1,-1};
int dy[]={1,-1,0,0,-1,1,-1,1};// 定义方位数组 

void bfs(point start){
    queue<point> q;// 定义 q队列 
    q.push(start);// 将 start 放入队列中 
    vis[start.x][start.y]=1;// 标记 
    while(!q.empty()){
        point cur=q.front();// 定义一个变量 cur,使它变成队头元素 
        q.pop();
        for(int i=0;i<8;i++){
            point nxt;// 定义一个变量 nxt
            nxt.x=cur.x+dx[i],nxt.y=cur.y+dy[i];
            if(nxt.x<1||nxt.x>n||nxt.y<1||nxt.y>m) continue;
            if(vis[nxt.x][nxt.y] || a[nxt.x][nxt.y]=='.') continue;
                q.push(nxt);
                vis[nxt.x][nxt.y]=1;// 注意咯!要标记
        }
    } 
}
int main(){
    cin >> n >> m;// 输入 n行m列 
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin >> a[i][j];// 循环输入 a数组 
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(a[i][j]!='.' && !vis[i][j]){
                ans++;
                bfs({i,j});// 进入广搜 
            }
        }
    }
    cout << ans << endl;// 输出 ans 就好啦
}

其实所有的题都是差不多的代码

只要改一改就AC啦

嘿嘿好啦拜拜(爱心

(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ❤

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值