一矩形陣列由數字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; }