一矩形阵列由数字0到9组成,数字1到9表明细胞,细胞的定义为沿细胞数字上下左右仍是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
如:阵列
0234500067
1034560500
2045600671
0000000089
有4个细胞
spa
题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1152php
http://ybt.ssoier.cn:8088/problem_show.php?pid=1329ios
https://www.luogu.com.cn/problem/P1451数组
一矩形阵列由数字0到9组成,数字1到9表明细胞,细胞的定义为沿细胞数字上下左右仍是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。
如:阵列
0234500067
1034560500
2045600671
0000000089
有4个细胞
spa
第一行 :两个数字M N (1<=M<=50 1<=N<80)表示该阵列有M行N列,从第2行到第M+1行 每行有连续的N个字符。
code
一行: 细胞个数。blog
4 10
0234500067
1034560500
2045600671
0000000089
4
做者分析:这道题是一道经典的DFS搜索的题目,使用DFS求连通块,注意,洛谷的题目需改变数组的大小。
#include <iostream> #include <cstring> using namespace std; int idx[51][81],m,n,ans = 0; char a[51][81]; void dfs(int x,int y,int id){ if (x < 0 || x >= m || y < 0 || y >= n) return; if (idx[x][y] > 0 || a[x][y] == '0') return; idx[x][y] = id;
// 上下左右搜索 dfs(x - 1,y,id); dfs(x + 1,y,id); dfs(x,y + 1,id); dfs(x,y - 1,id); } int main(){ memset(a,0,sizeof(a)); memset(idx,0,sizeof(idx)); cin >> m >> n; for (int i = 0;i < m;i++){ cin >> a[i]; } int cnt = 0; for (int i = 0;i < m;i++){ for (int j = 0;j < n;j++){ if (idx[i][j] == 0 && a[i][j] != '0'){ dfs(i,j,++cnt); } } } cout << cnt; return 0; }