关于题解栏塞不下的事,我不想多说什么了……
上次投票结果:
P1135 奇怪的电梯 关于是否写注释的投票:
1:1,在这里发起加时赛。
P1162 填涂颜色 关于是否单独出
B
F
S
BFS
BFS教程的投票:
1:2,我就不出了哈。
好的,进入正题!
题目大意:
一个农场刚下完雨,有一些地方积水了,要我们求农场中的八连通块有多少个。
解题思路:
一看着求联通块,不就用广搜吗?
用
q
x
,
q
y
qx,qy
qx,qy存坐标,
c
h
e
a
k
cheak
cheak函数判断是否合法(该点再图内,而且是水,且没有被访问过),
c
h
e
a
k
(
x
,
y
)
cheak(x,y)
cheak(x,y)判断
(
x
,
y
)
(x,y)
(x,y)是否合法,
数组
a
a
a存图,
a
[
i
]
[
j
]
a[i][j]
a[i][j]表示农场的
(
i
,
j
)
(i,j)
(i,j)坐标,
v
[
i
]
[
j
]
v[i][j]
v[i][j]表示农场的
(
i
,
j
)
(i,j)
(i,j)坐标是否被访问过,
d
x
,
d
y
dx,dy
dx,dy存方向。
代码实现:
需要洛谷全AC图才可复制
#include<bits/stdc++.h>
using namespace std;
char a[105][105];
bool v[105][105];
int dx[8]={0,1,1,1,0,-1,-1,-1};
int dy[8]={1,1,0,-1,-1,-1,0,1};
queue<int>qx;
queue<int>qy;
int n,m,ans;
bool cheak(int x,int y){
return (x>=1&&x<=n&&y>=1&&y<=m&&!v[x][y]&&a[x][y]!='.');
}
void gs(int ax,int ay){
int x,y,tx,ty,i;
qx.push(ax);
qy.push(ay);
v[x][y]=1;
while (qx.size()){
x=qx.front();
y=qy.front();
qx.pop();
qy.pop();
for (i=0;i<8;i++){
tx=x+dx[i];
ty=y+dy[i];
if (cheak(tx,ty)){
qx.push(tx);
qy.push(ty);
v[tx][ty]=1;
}
}
}
}
int main(){
cin>>n>>m;
int i,j;
for (i=1;i<=n;i++){
cin>>a[i]+1;
}
for (i=1;i<=n;i++){
for (j=1;j<=m;j++){
if (a[i][j]=='W'&&!v[i][j]){
gs(i,j);
ans++;
}
}
}
cout<<ans;
}
祝你AC!