c++ 面试题(1)-----深度优先搜索(DFS)实现

  • 操作系统:ubuntu22.04
  • IDE:Visual Studio Code
  • 编程语言:C++11

题目描述

地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。

复制代码
例如:

当 k = 18 时,机器人可以进入方格 [35, 39](因为 3+5 + 3+9 = 20 > 18,所以不能进入)
问:机器人总共能到达多少个格子?

示例

bash 复制代码
输入:m=2, n=3, k=1
输出:3

解释:

机器人从 [0,0] 出发,可到达以下格子:

  • 0,0

  • 0,1

  • 0,2

但 [1,0] 的数位和为 1+0=1 ≤ 1,也可以走;

但 [1,1] 的数位和为 1+1=2 > 1,不能进入。

所以总共有 3 个格子可以进入。

解法思路

这是一个典型的 搜索类问题,可以用:

复制代码
深度优先搜索(DFS)
或 广度优先搜索(BFS)

我们只需要从起点 (0, 0) 开始,向四个方向进行递归/遍历,只要满足条件就继续探索,并统计所有能到达的格子。

代码示例

cpp 复制代码
#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    int movingCount( int m, int n, int k )
    {
        vector< vector< bool > > visited( m, vector< bool >( n, false ) );
        return dfs( 0, 0, m, n, k, visited );
    }

    int dfs( int i, int j, int m, int n, int k, vector< vector< bool > >& visited )
    {
        // 边界条件判断 or 已访问过 or 不满足数位和条件
        if ( i < 0 || i >= m || j < 0 || j >= n || visited[ i ][ j ] || bitSum( i ) + bitSum( j ) > k )
            return 0;

        visited[ i ][ j ] = true;  // 标记为已访问

        // 向四个方向探索
        return 1 + dfs( i + 1, j, m, n, k, visited ) + dfs( i - 1, j, m, n, k, visited ) + dfs( i, j + 1, m, n, k, visited ) + dfs( i, j - 1, m, n, k, visited );
    }

    // 计算一个整数的各位数字之和
    int bitSum( int x )
    {
        int sum = 0;
        while ( x > 0 )
        {
            sum += x % 10;
            x /= 10;
        }
        return sum;
    }
};

// 测试代码
int main()
{
    Solution solution;
    cout << solution.movingCount( 2, 3, 1 ) << endl;  // 输出: 3
    cout << solution.movingCount( 3, 3, 0 ) << endl;  // 输出: 1
    return 0;
}

运行结果

bash 复制代码
3
1
相关推荐
葫三生13 分钟前
如何评价《论三生原理》在科技界的地位?
人工智能·算法·机器学习·数学建模·量子计算
pipip.17 分钟前
UDP————套接字socket
linux·网络·c++·网络协议·udp
拓端研究室2 小时前
视频讲解:门槛效应模型Threshold Effect分析数字金融指数与消费结构数据
前端·算法
随缘而动,随遇而安4 小时前
第八十八篇 大数据中的递归算法:从俄罗斯套娃到分布式计算的奇妙之旅
大数据·数据结构·算法
孞㐑¥5 小时前
Linux之Socket 编程 UDP
linux·服务器·c++·经验分享·笔记·网络协议·udp
IT古董5 小时前
【第二章:机器学习与神经网络概述】03.类算法理论与实践-(3)决策树分类器
神经网络·算法·机器学习
水木兰亭8 小时前
数据结构之——树及树的存储
数据结构·c++·学习·算法
Jess079 小时前
插入排序的简单介绍
数据结构·算法·排序算法
老一岁9 小时前
选择排序算法详解
数据结构·算法·排序算法
CoderCodingNo9 小时前
【GESP】C++四级考试大纲知识点梳理, (7) 排序算法基本概念
开发语言·c++·排序算法