洛谷P1451 求细胞数量

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值