此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接:https://www.luogu.org/problem/show?pid=1451
题目描述
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。(1<=m,n<=100)?
输入输出格式
输入格式:输入:整数m,n(m行,n列)
矩阵
输出格式:输出:细胞的个数
输入输出样例
输入样例#1:4 10输出样例#1:
0234500067
1034560500
2045600671
0000000089
4
分析:
深度优先搜索。
但是这题的题面有两个地方需要注意:1.四方向搜索 2.1~9是细胞,0不是细胞。
AC代码:
1 #include<iostream>
2 #include<cstdio>
3 #include<cmath>
4 #include<algorithm>
5
6 using namespace std;
7 char mp[110][110];
8 int tmp,m,n,ans = 0;
9 void dfs(int x,int y)
10 {
11 mp[x][y] = '0';
12 //标记已经读过的细胞-小技巧
13 for(int i = -1;i <= 1;i ++)
14 for(int j = -1;j <= 1;j ++)
15 {
16 if((abs(i) + abs(j)) == 1)
17 {//这里用了一个控制,防止八方向搜索
18 int nx = x + i;
19 int ny = y + j;
20 if(nx > 0 && nx <= m && ny > 0 && ny <= n && mp[nx][ny] != '0')
21 dfs(nx,ny);
22 }
23 }
24 return;
25 }
26
27 int main()
28 {
29 scanf("%d%d",&m,&n);
30 for(int i = 1;i <= m;i ++)
31 scanf("%s",mp[i] + 1);
32 for(int i = 1;i <= m;i ++)
33 for(int j = 1;j <= n;j ++)
34 {
35 if(mp[i][j] > '0' && mp[i][j] <= '9')
36 //如果是细胞,就进入搜索
37 dfs(i,j),ans ++;
38 }
39 printf("%d",ans);
40 return 0;
41 }