SWUST OJ 964: 数细胞

964.数细胞

题目链接-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;
}
发布了78 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Fiveneves/article/details/104532517