猴群
时间限制:1秒 内存限制:128M
题目描述
给出一个由数字0~9组成的矩形,其中数字0代表树,1~9代表猴子,凡是由0或矩形边围起来的区域表示有一群猴子在这一带。编程求矩形中有多少群猴子
输入描述
第一行两个正整数,表示矩形的行数m和列数n,1<=m,n<=100
下面为一个mxn的数字矩形
输出描述
一行一个数,表示猴群的数目
样例
输入
7 6
100100
000003
000000
000000
050100
004000
000000
输出
6
我们先来分析一下这道题:
也就是说,被边框围起来或树围起来的一片区域(这片区域是猴)那就算一个猴群,现在问你有几个猴群,我们只需要找到有多少(一个或多个猴子)被边界或树围起来,我们这道题很明显用深搜,判断上下左右,那不仅需要用深搜,还得用方向数组(dx,dy)了。好了,上代码吧。
AC:
#include <bits/stdc++.h>
using namespace std;
const int w=105;
int n,m;
int cnt=0;
bool vis[w][w]; //标记数组二维的
char a[w][w];
int dx[4]={-1,0,1,0}; //方向数组
int dy[4]={0,1,0,-1};
void dfs(int x,int y) //进行一次深搜
{
vis[x][y]=1;
for(int i=0;i<=3;i++)
{
int xx=x+dx[i]; //xx和yy会依次判断上下左右
int yy=y+dy[i];
if(xx<0||yy<0||xx>m-1||yy>n-1) //查看越界
{
continue; //越界直接跳过
}
if(a[xx][yy]!='0'&&vis[xx][yy]==0) //这里既然没越界,如果上下左右每一个地方没猴子,并且上下左右每一个地方没标记过,那就(看下一个)
{
dfs(xx,yy); //那就直接递归
}
}
}
int main()
{
cin>>m>>n;
for(int i=0;i<m;i++) //输入二维数组
{
for(int j=0;j<n;j++)
{
cin>>a[i][j]; //没啥好说的
}
}
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]!='0'&&vis[i][j]==0) //只要不等于零,也就是猴子,并且这没标记过
{
dfs(i,j);
cnt++; //深搜的同时计数
}
}
}
cout<<cnt<<endl; ///输出
return 0;
}