百度C++岗2017笔试第三题分析

来源:互联网 发布:sql数据库实训总结 编辑:程序博客网 时间:2024/06/06 03:21

百度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 41 1 0 012 51 0 0 0 00 1 1 1 123 61 1 1 0 1 01 0 0 1 0 01 0 0 1 1 035 51 0 1 0 11 1 0 1 10 1 1 0 11 1 0 1 00 1 1 1 136 61 1 0 0 1 00 0 0 0 0 00 0 1 0 1 00 0 1 1 0 11 0 0 0 0 00 1 0 0 1 08*/
0 0
原创粉丝点击