题目描述
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。(1<=m,n<=100)?
输入输出格式
输入格式:输入:整数m,n(m行,n列)矩阵
输出:细胞的个数
输入输出样例
输入样例#1:
4 10 0234500067 1034560500 2045600671 0000000089
输出样例#1:
4
DFS(定义:在有向图的遍历中找出一个未被访问的顶点做为起始顶点,然后由当前顶点的边走到未访问的顶点;当没有未被访问的顶点时,则回到上一个顶点,继续试探访问别的顶点,直到所有顶点被访问过)
//DFS
#include <stdio.h>
#include<string.h>
#include <iostream>
using namespace std;
int n,m;
char a[106][106];
bool vis[106][106];
/*上下左右方法1
void dfs(int i,int j)
{
vis[i][j]=true;
//int h=a[i][j]-'1'+1;
if(i+1<=n&&!vis[i+1][j]&&a[i+1][j]!='0') dfs(i+1,j);
if(j+1<=m&&!vis[i][j+1]&&a[i][j+1]!='0') dfs(i,j+1);
if(i-1>=1&&!vis[i-1][j]&&a[i-1][j]!='0') dfs(i-1,j);
if(j-1>=1&&!vis[i][j-1]&&a[i][j-1]!='0') dfs(i,j-1);
}
*/
int xx[5]={0,1,0,-1,0};//注意0~4J就为{1,0,-1,0};
int yy[5]={0,0,1,0,-1};//
void dfs(int i,int j)
{
for(int k=1;k<5;k++)
if((i+xx[k]>=1)&&(i+xx[k]<=n)&&(j+yy[k]>=1)&&(j+yy[k]<=m)&&(a[i+xx[k]][j+yy[k]]!='0')&&(!vis[i+xx[k]][j+yy[k]]))
{
vis[i+xx[k]][j+yy[k]]=true;
dfs(i+xx[k],j+yy[k]);
}
}
int main()
{
int sum;
memset(vis,false,sizeof(vis));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
sum=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]!='0'&&!vis[i][j])
{
sum++;
vis[i][j]=true;
dfs(i,j);
}
printf("%d",sum);
return 0;
}
BFS(一层层的搜)
#include<stdio.h>
#include <string.h>
#include <queue>
#include <iostream>
using namespace std;
int n,m,tnt=0;
int xx[4]={1,0,-1,0};
int yy[4]={0,1,0-1};
bool a[106][106];
void bfs(int i,int j)
{
queue<int>qx,qy;
tnt++;
int x,y;
qx.push(i);
qy.push(j);
a[i][j]=false;
while(!qx.empty())
{
for(int k=0;k<4;k++)
{
x=qx.front()+xx[k];
y=qy.front()+yy[k];
if(x>=1&&x<=n&&y>=1&&y<=m&&a[x][y])
{
qx.push(x);
qy.push(y);
a[x][y]=false;
}
}
qx.pop(),qy.pop();
}
}
int main ()
{
string s;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
cin>>s;
for(int j=0;j<m;j++)//注意s起始是从0开始的
if(s[j]=='0') a[i][j+1]=false;
else a[i][j+1]=true;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j])
bfs(i,j);
printf("%d",tnt);
return 0;
}