964.数细胞
题目描述
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
输入
第一行输入两个整数,分别代表矩阵的行和列 输入m*n的矩阵,由数字0到9组成 |
输出
细胞个数 |
样例输入
4 10
1 2 3 4 5 1 1 1 6 7
1 0 3 4 5 6 1 5 1 0
2 0 4 5 6 6 1 6 7 1
0 0 6 0 6 6 1 0 8 9
样例输出
1
解题思路
dfs简单题,统计连通区域
题目代码要求用bfs(队列),但是我还是想用dfs (手动滑稽(~ ̄▽ ̄)~)
- 数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是(非零)细胞数字则为同一细胞
- 因为0不是细胞数字,在输入的时候对0就进行处理,用vis数组标记为1
- 深度优先搜索,即遍历矩阵时候,如果该细胞数字没有被搜索过,即vis[i][j]=0,则进行dfs搜索,先将这个位置用vis数组标记为1,以免重复遍历,然后再排查其相邻的所有范围是否有非0数字,有则用vis数组标记为1(因为相邻的话就算作一个细胞了)
- num用来计数,因为每次搜索的时候与maze[i][j]同一细胞的细胞数字已经被标记,所以每次搜索后+1即可
附上代码
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=10010;
typedef long long ll;
typedef pair<int,int> PII;
int way[4][2]={1,0,-1,0,0,1,0,-1};
int maze[N][N],n,m;
bool vis[N][N];
int num;
void dfs(int i,int j){
for(int k=0;k<4;k++){
int x=i+way[k][0];
int y=j+way[k][1];
if(x>=1&&y>=1&&x<=n&&y<=m&&!vis[x][y]){
vis[x][y]=1;
dfs(x,y);
}
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>maze[i][j];
if(maze[i][j]==0)
vis[i][j]=1;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(!vis[i][j]){
dfs(i,j);
num++;
}
}
}
cout<<num;
return 0;
}
来源:CSDN
作者:Fiveneves
链接:https://blog.csdn.net/Fiveneves/article/details/104532517