P1451 求细胞数量
题目地址
https://www.luogu.com.cn/problem/P1451
题目大意
题目描述
一矩形阵列由数字 0 到 9 组成,数字 1 到 9 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
输入格式
第一行两个整数代表矩阵大小 n 和 m。
接下来 n 行,每行一个长度为 m 的只含字符 0 到 9 的字符串,代表这个 n×m 的矩阵。
比较简单的题,但我的bfs&dfs很弱,就记下来,多练几次
具体思路可以看这道题的解析
https://www.luogu.com.cn/problem/solution/P1451
注意点
用scanf读入整数的时候可以控制读入的位数,比如```scanf("%2d",&m);
scanf("%1d",&a[c][d]);
解题思路 dfs
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N = 205;
int a[N][N];
// L D R U
int dx[]={-1,0,1,0};
int dy[]={0,-1,0,1};
void dfs(int x,int y){
if(x > n || y > m || x < 1 || y < 1)
return ;
a[x][y] = 0;
for(int i = 0;i < 4;i++){
if(a[x + dx[i]][y + dy[i]]){
dfs(x + dx[i],y + dy[i]);
}
}
}
int main(){
// freopen("1.txt","r",stdin);
cin >> n >> m;
int all = 0;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
scanf("%1d",&a[i][j]);
}
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
if(a[i][j]){
all++;
dfs(i,j);
}
}
}
cout << all << "\n";
return 0;
}
解题思路 bfs
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
int n,m;
const int N = 205;
int a[N][N];
int f[N][N];
struct Pos{
int x,y;
};
deque<Pos> q;
// L R D U
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
void bfs(int x,int y){
Pos p;
p.x = x;
p.y = y;
q.pb(p);
while(!q.empty()){
Pos ps = q.front();
for(int i = 0;i < 4;i++){
Pos pnow = ps;
pnow.x += dx[i];
pnow.y += dy[i];
if(a[pnow.x][pnow.y] == 0 || f[pnow.x][pnow.y] == 1)
continue;
f[pnow.x][pnow.y] = 1;
q.pb(pnow);
}
q.pop_front();
}
}
int main(){
// freopen("1.txt","r",stdin);
cin >> n >> m;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++)
scanf("%1d",&a[i][j]);
int all = 0;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= m;j++){
if(f[i][j] == 0 && a[i][j] != 0){
bfs(i,j);
all++;
}
}
}
cout << all << endl;
return 0;
}