百度C++岗2017年笔试题 第三题:
为了进程城市规划,需要计算居民区的住宅数目。该区域是一个n*m的网格,如果有屋顶则为1,
如果是空地则为0.有1组成的相邻网格单元组成的簇为一个单独住宅。对角为1不是。
输入:小区的图,由0,1表示
输出:住宅总数。
解题思路:对于每一个访问到的格子,先让它为0,然后递归访问上下左右的格子
为1,则继续访问,为0则退出。
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <random>
using namespace std;
//递归函数:访问i, j位置的四周的点
void dfs(vector<vector<int>>& matrix, int i, int j)
{
if (i < 0 || i > matrix.size() - 1 || j < 0 || j > matrix[0].size() - 1)
return;
if (matrix[i][j] == 0)
return;
else
{
matrix[i][j] = 0;
dfs(matrix, i - 1, j);
dfs(matrix, i + 1, j);
dfs(matrix, i, j - 1);
dfs(matrix, i, j + 1);
}
}
//得到住宅总数
int getNum(vector<vector<int>>& matrix)
{
int res = 0;
for (int i = 0; i < matrix.size(); ++i)
{
for (int j = 0; j <matrix[0].size(); ++j)
{
//为1才访问
if (matrix[i][j] == 1)
{
res++;
dfs(matrix, i, j); //递归
}
}
}
return res;
}
int main()
{
int m; int n;
//测试用
while (cin >> m, cin >> n)
{
vector<vector<int>> matrix;
matrix.resize(m, vector<int>(n, 0));
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
{
matrix[i][j] = rand()%2;
}
}
for (auto v : matrix)
{
for (auto i : v)
cout << i << " ";
cout << endl;
}
cout << getNum(matrix) << endl;
}
}
/*
测试用例:
1 4
1 1 0 0
1
2 5
1 0 0 0 0
0 1 1 1 1
2
3 6
1 1 1 0 1 0
1 0 0 1 0 0
1 0 0 1 1 0
3
5 5
1 0 1 0 1
1 1 0 1 1
0 1 1 0 1
1 1 0 1 0
0 1 1 1 1
3
6 6
1 1 0 0 1 0
0 0 0 0 0 0
0 0 1 0 1 0
0 0 1 1 0 1
1 0 0 0 0 0
0 1 0 0 1 0
8
*/