求细胞数量:一矩形阵列由数字 0 到 9 组成,数字 1 到 9 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。

题目描述
一矩形阵列由数字 0 到 9 组成,数字 1 到 9 代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。

输入
第一行两个整数代表矩阵大小 n 和 m。 接下来 n 行,每行一个长度为 m 的只含字符 0 到 9 的字符串,代表这个n×m 的矩阵。

输出
一行一个整数代表细胞个数。

样例输入 Copy
4 10
0234500067
1034560500
2045600671
0000000089

样例输出 Copy
4

提示
0 < m, n <= 400

#include<bits/stdc++.h>
using namespace std;
int n,m;
int ans;
char a[105][105];
void dfs(int x,int y)
{
    if(x>n||x<1||y>m||y<1||a[x][y]=='0')return;
    a[x][y]='0';
    dfs(x+1,y);
    dfs(x,y+1);
    dfs(x-1,y);
    dfs(x,y-1);
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++) cin>>a[i][j];
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(a[i][j]!='0')ans++,dfs(i,j);
        }
    }
    cout<<ans<<endl;
    return 0;
}


转载于:
https://blog.csdn.net/weixin_44336954/article/details/95970176

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 题目描述:给定一个由数字到9组成矩形阵列,其中数字1到9代表细胞细胞定义为沿细胞数字上下左右还是细胞数字则为同一细胞给定矩形阵列细胞个数。 解题思路:可以使用深度优先搜索(DFS)或广度优先搜索(BFS)来解决此问题。对于每个细胞,我们可以从它开始,向上下左右四个方向搜索,如果搜索到的数字是1到9,则说明是同一细胞,继续搜索下去。搜索过的细胞可以标记为已访问,避免重复计算。 代码实现:可以使用递归实现DFS,也可以使用队列实现BFS。以下是DFS的代码实现: ### 回答2: 题目描述:给定一个由数字0到9组成矩形阵列,其中数字1到9代表细胞细胞定义为沿细胞数字上下左右还是细胞数字则为同一细胞。请计算给定矩形阵列细胞个数。 思路分析:此题需要通过遍历矩阵,判断每个数字是否为细胞来计算细胞个数。具体来说,可以通过深度优先搜索或广度优先搜索实现。以深度优先搜索为例,对于每个数字为1-9的位置,从当前位置出发,搜索其上下左右四个方向,如果该方向上的数字也为1--9,那么继续搜索,否则返回。在搜索时,可以通过将已访问过的数字标记为‘0’,避免重复访问。最终,矩阵中标记为‘1’的数字个数就是细胞个数。 代码实现: //定义方向数组 int dx[4]={1,-1,0,0}; int dy[4]={0,0,1,-1}; //DFS搜索 void dfs(vector<vector<char>>& grid,int x,int y){ int n=grid.size(); int m=grid[0].size(); //搜索完当前细胞后,将其标记为‘0’,避免重复访问 grid[x][y]='0'; for(int i=0;i<4;i++){ int nx=x+dx[i]; int ny=y+dy[i]; if(nx>=0 && nx<n && ny>=0 && ny<m && grid[nx][ny]>'0'){ dfs(grid,nx,ny); } } } int countCells(vector<vector<char>>& grid) { int n=grid.size(); int m=grid[0].size(); int res=0; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(grid[i][j]>'0'){ dfs(grid,i,j); res++; } } } return res; } 时间复杂度:O(nm) 空间复杂度:O(nm) ### 回答3: 这是一个常见的二维数组/矩阵问题,可以用深度优先搜索(DFS)或广度优先搜索(BFS)来解决。 以DFS为例,我们可以先遍历整个矩阵,遇到第一个数字为1的格子就进入DFS,依次搜索4个方向,将访问过的细胞标记为'#',直到找完与该细胞相邻的所有细胞,然后回溯到上一级,继续搜索下一个未被标记的细胞,直到整个矩阵都被遍历完为止,记录被访问的细胞个数即可。 具体实现时,可以用一个visited数组记录每个点是否已经被访问过,若访问到的点为'#'或越界或数字为0,则返回,否则继续搜索该点的四周。 以下是DFS的代码实现(C++): ``` int dfs(vector<vector<char>>& grid, int i, int j) { if (i < 0 || j < 0 || i >= grid.size() || j >= grid[0].size() || grid[i][j] == '#' || grid[i][j] == '0') return 0; grid[i][j] = '#'; return 1 + dfs(grid, i - 1, j) + dfs(grid, i + 1, j) + dfs(grid, i, j - 1) + dfs(grid, i, j + 1); } int countCells(vector<vector<char>>& grid) { int count = 0; for (int i = 0; i < grid.size(); i++) { for (int j = 0; j < grid[0].size(); j++) { if (grid[i][j] == '1') count += dfs(grid, i, j); } } return count; } ``` 其中,grid是二维矩阵,'0'~'9'是该矩阵内的数字,'#'表示该点已经被访问过,count表示细胞个数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值