3602 - 查找细胞

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。

题目输入

第一行输入n,m;表示n行m列矩阵。

接下来输入该n*m矩阵

题目输出

细胞个数

输入/输出样例

输入格式

4 10
0234500067
1034560500
2045600671
0000000089

输出格式

4

C语言解答

#include <stdio.h>
int dir[4][2]= {0,1,0,-1,1,0,-1,0};
int n,m;
int mat[1005][1005];
void dfs(int x,int y)
{
    mat[x][y]=0;
    int i,tx,ty;
    for(i=0;
            i<4; ++i)
    {
        tx=x+dir[i][0];
        ty=y+dir[i][1];
        if(tx<0||tx>=n||ty<0||ty>=m)continue;
        if(mat[tx][ty])dfs(tx,ty);
    }
}
void main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        int ans = 0;
        int i,j;
        for(i=0; i<n; ++i)
            for(j=0; j<m; ++j)
                scanf("%1d",&mat[i][j]);
        for(i=0; i<n; ++i)
            for(j=0; j<m; ++j)
                if(mat[i][j])
                {
                    ++ans;
                    dfs(i,j);
                }
        printf("%d\n",ans);
    }
}

C++解答

#include<iostream>
#include<cstring>
using namespace std;
int n,m,tot=0;
char a[101][101];
int dx[]={0,-1,0,1},dy[]={-1,0,1,0};
bool b[101][101];
struct data{
	int x,y;
}p[1000];
void dfs(int r,int s)
{
	int head,tail;
	int nx,ny,first=1;
	
	head=1;tail=1;
	p[head].x=r;
	p[head].y=s;
	b[r][s]=false;
	++tot;
	while(head<=tail)
	{
		
		for(int i=0;i<4;++i)
		{
		    nx = p[head].x+dx[i];
			ny = p[head].y+dy[i];
			
			if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&b[nx][ny]==true)
			{
				++tail;
				p[tail].x=nx;
				p[tail].y=ny;
				b[nx][ny]=false;
			}
			/*if(head==tail)
			{
				
				for(int i=1;i<=n;++i)
				{
					for(int j=1;j<=m;++j)
					 cout << b[i][j] << " ";
					cout << endl;
				}
				cout << endl;
				return;
			}*/
		}
		++head;
	}
}
int main()
{
	cin >> n >> m;
	
	for(int i = 1; i <= n ;++i)
	for(int j = 1;j <= m; ++j)
	 {
	   cin >> a[i][j];
	   
	   if(int(a[i][j]-48))b[i][j]=true;
	   else b[i][j]=false;
     }
	
	for(int i=1;i<=n;++i)
	for(int j=1;j<=m;++j)
	{
		if(b[i][j])
		dfs(i,j);
	}
	
	cout << tot;
	
	return 0;
}

Java解答

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
	static int [][] map;
	static int n,m,count = 0;
	public static void main(String[] agrs) {
		Scanner cin = new Scanner(System.in);
		n = cin.nextInt();
		m = cin.nextInt();
		cin.nextLine();
		map = new int[n][m];
		for(int i = 0; i < n; i ++) {
			String str = cin.nextLine();
			for(int j = 0; j < m; j ++) 
				map[i][j] = Integer.parseInt(str.substring(j, j+1));
		}
		
		for(int i = 0; i < n; i ++) {
			for(int j = 0; j < m; j ++) {
				if(map[i][j]!=0) {
					bfs(i,j);
					count ++;
				}
			}
		}
		System.out.println(count);
	}

	public static void bfs(int x,int y) {
		int [] dx= {0,-1,0,1};
		int [] dy = {-1,0,1,0};		
		map[x][y] = 0;
		for(int i = 0; i < 4; i ++) {
			int tx = x + dx[i];
			int ty = y + dy[i];
			if(tx >= 0 && tx < n && ty >= 0 && ty < m && map[tx][ty] != 0) {
				bfs(tx,ty);
			}
		}
	}
}