AcWing 24:机器人的运动范围 ← BFS、DFS

【题目来源】
https://www.acwing.com/problem/content/description/22/

【题目描述】
地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼n−1。
一个机器人从坐标 (0,0) 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格。
但是不能进入行坐标和列坐标的数位之和大于 k 的格子。
请依次输入k,m,n,问该机器人能够达到多少个格子?
注意:0<=m<=50,0<=n<=50,0<=k<=100

【算法分析】
◆DFS算法模板:https://blog.csdn.net/hnjzsyjyj/article/details/125801217

cpp 复制代码
void dfs(int step){
    判断边界{
        输出解 
    }
 
    尝试每一种可能{
        满足check条件{
            标记
            继续下一步:dfs(step+1)
            恢复初始状态(回溯的时候要用到)
        }
    }
}

◆BFS算法模板:https://blog.csdn.net/hnjzsyjyj/article/details/118736059

cpp 复制代码
助记:建-入-量:头-出-入"。

其中,"建-入-量:头-出-入"各字的解析如下:
建:建队
入:入队
量:队中元素个数。作为while循环的条件。
头:队头
出:出队
入:入队

一个记忆场景,"小猫咪在建好的洞口,想入洞。先用胡子量过洞口大小后,然后用头出入洞"。

【算法代码:DFS】

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

const int maxn=105;
int flag[maxn][maxn];
int sum=0;

int dfs(int x,int y,int k,int m,int n) {
    if(flag[x][y]==1 || x>=m || y>=n || (x/10+x%10+y/10+y%10)>k) return 0;
    flag[x][y]=1;
    sum=dfs(x+1,y,k,m,n)+dfs(x,y+1,k,m,n)+1;
    return sum;
}

int movingCount(int k,int m,int n){
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            flag[i][j]=0;
        }
    }
    return dfs(0,0,k,m,n);
}

int main(){
    int k,m,n;
    cin>>k>>m>>n;
    cout<<movingCount(k,m,n)<<endl;

    return 0;
}

/*
in:5 0 0
out:0

in:7 4 5
out:20

in:18 40 40
out:1484
*/

【算法代码:BFS】

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

const int maxn=105;
int flag[maxn][maxn];
int sum=0;

int movingCount(int k,int m,int n) {
    if(m==0 || n==0) return 0; //very important
    for(int i=0; i<m; i++) {
        for(int j=0; j<n; j++) {
            flag[i][j]=0;
        }
    }
    queue<pair<int,int>> q;
    q.push({0,0});
    flag[0][0]=1;
    int dx[]= {0,0,-1,1};
    int dy[]= {-1,1,0,0};
    while(!q.empty()) {
        auto t=q.front(); //pair<int,int> t=q.front();
        q.pop();
        int x=t.first;
        int y=t.second;
        sum++;
        for(int i=0; i<4; i++) {
            int nx=x+dx[i];
            int ny=y+dy[i];
            if(nx<0 || ny<0) continue;
            if(flag[nx][ny]==1 || nx>=m || ny>=n || (nx/10+nx%10+ny/10+ny%10)>k) continue;
            q.push({nx,ny});
            flag[nx][ny]=1;
        }
    }
    return sum;
}

int main() {
    int k,m,n;
    cin>>k>>m>>n;
    cout<<movingCount(k,m,n)<<endl;

    return 0;
}

/*
in:5 0 0
out:0

in:7 4 5
out:20

in:18 40 40
out:1484
*/

【参考文献】
https://blog.csdn.net/qq_40184885/article/details/89483505
https://www.cnblogs.com/wzw0625/p/12731031.html

相关推荐
CUC-MenG6 天前
2025牛客多校第九场 G.排列 A.AVL树 F.军训 个人题解
数学·dfs·dp·笛卡尔树·组合数·曼哈顿距离·树上dp
是阿建吖!7 天前
【递归、搜索与回溯算法】穷举、暴搜、深搜、回溯、剪枝
算法·bfs·剪枝
qiuyunoqy11 天前
蓝桥杯算法之搜索章 - 3
c++·算法·蓝桥杯·深度优先·dfs·剪枝
CUC-MenG15 天前
快速莫比乌斯变换(FMT)与莫比乌斯反演 例题:树上lcm
数学·dfs·fmt
CUC-MenG16 天前
2025牛客多校第五场 K.完美旅程 J.最快覆盖问题 E.神秘异或操作 个人题解
数学·dfs·bfs·优先队列·二分·位运算·fmt·曼哈顿距离·fwt
屈臣18 天前
AtCoder Beginner Contest 417 (A-E题解)
动态规划·dfs·二分
Espresso Macchiato21 天前
Leetcode 3629. Minimum Jumps to Reach End via Prime Teleportation
bfs·广度优先遍历·leetcode medium·leetcode 3629·leetcode周赛460·质数求解·质因素分解
一只小蒟蒻1 个月前
DFS 迷宫问题 难度:★★★★☆
算法·深度优先·dfs·最短路·迷宫问题·找过程
9527过了头2 个月前
C. Bertown Subway
算法·dfs·
柏箱2 个月前
容器里有10升油,现在只有两个分别能装3升和7升油的瓶子,需要将10 升油等分成2 个5 升油。程序输出分油次数最少的详细操作过程。
算法·bfs