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ᵒᵛᵉᵧₒᵤ❤