大疆笔试 大疆笔试题 0818

无人机

#include <iostream>
#include <vector>


using namespace std;

class Solution {
public:

    /* Write Code Here */
    int ans = 1, n = 0, m = 0;
    vector<vector<int>> g;  // 保存图
    vector<vector<vector<bool>>> std; // 保存该点,某方向 是否访问过了
    vector<vector<bool>> st; // 保存该点是否访问过了

    vector<int> dx = {0, 1, 0, -1}, dy = {1, 0 ,-1 , 0};

    void dfs(int x, int y, int d)
    {
        for (int i = 0; i < 4; i++) {
            int nd = (d + i) % 4; // 方向要和上一个方向保持一致
            int nx = x + dx[nd] , ny = y + dy[nd];
            if (nx > -1 && nx < n && ny > -1 && ny < m && !g[nx][ny]) { // 合法坐标,并且可访问
                if (!st[nx][ny])  ans++; // 统计过了 就不需要统计了
                st[nx][ny] = true;
                if (!std[x][y][nd]) { // 当前方向没有被访问过,防止死循环
                    std[x][y][nd] = true;
                    dfs(nx , ny, nd);
                }
                return;
            }
        }
    }
    int numberOfPatrolBlocks(vector < vector < int > > block) {
        n = block.size(), m = block[0].size();
        g = block;
        st = vector<vector<bool>> (n, vector<bool>(m));
        std = vector<vector<vector<bool>>> (n, vector<vector<bool>> (m, vector<bool>(4)));
        ans = 1;
        st[0][0] = true;
        dfs(0, 0, 0);
        return ans;
    }
};
int main() {
    int res;

    int block_rows = 0;
    int block_cols = 0;
    cin >> block_rows >> block_cols;
    vector< vector < int > > block(block_rows);
    for(int block_i=0; block_i<block_rows; block_i++) {
        for(int block_j=0; block_j<block_cols; block_j++) {
            int block_tmp;
            cin >> block_tmp;
            block[block_i].push_back(block_tmp);
        }
    }
    Solution *s = new Solution();
    res = s->numberOfPatrolBlocks(block);

    cout << res << endl;

    return 0;

}

#大疆求职进展汇总##大疆##笔试#
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-13 18:03
中联重科 硬件工程师 14*13-17 硕士985
点赞 评论 收藏
分享
4 3 评论
分享
牛客网
牛客企业服务