题目描述:
在一个被分成n*n个格子的平原上,有一些格子有铁矿,两格铁矿如果相邻那么就认为他们属于同一个矿床,每个矿床都包含一个或更多个铁矿,问一共有几个矿床。
两个格子只要有公共边或公共点就算相邻。
输入数据
第一行为一个正整数n,n<=1000 接下来有n行,每行有n个字符,表示平原的对应位置有没有铁矿,*代表没有,#代表有
输出数据
矿床个数
算法:
#include<iostream>
#include<queue>
using namespace std;
void dfs(char a[][1000], int r,int s,int n);
bool inArea(char a[][1000], int r, int c, int n);
int main()
{
int n,flag=0;
cin >> n;
char a[1000][1000];
for(int i=0;i<n;i++)
for (int j = 0; j < n; j++)
{
cin >> a[i][j];
}
for(int i=0;i<n;i++)
for (int j = 0; j < n; j++)
{
if (a[i][j] == '#')
{
dfs(a, i, j, n);
flag++;
}
}
cout << flag << endl;
}
void dfs(char a[][1000], int r,int c,int n)
{
if (!inArea(a, r, c, n))
return;
if (a[r][c] != '#')
return;
a[r][c] = '-';
dfs(a, r - 1, c - 1, n);
dfs(a, r - 1,c, n);
dfs(a, r - 1, c + 1, n);
dfs(a, r, c - 1, n);
dfs(a, r, c + 1, n);
dfs(a, r + 1, c - 1, n);
dfs(a, r + 1, c, n);
dfs(a, r + 1, c + 1, n);
}
bool inArea(char a[][1000], int r, int c,int n)
{
if (r >= 0 && r < n && c >= 0 && c < n)
return true;
else
return false;
}
上面利用了深度搜索的递归算法。该问题和Leetcode上的200题岛屿数量相同。