[acwing#24]机器人的运动范围(BFS-DFS)

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

地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0~m?1 和 0~n?1。

一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格。

但是不能进入行坐标和列坐标的数位之和大于 k 的格子。

请问该机器人能够达到多少个格子?

样例1

输入:k=7, m=4, n=5

输出:20

样例2

输入:k=18, m=40, n=40

输出:1484

解释:当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。
但是,它不能进入方格(35,38),因为3+5+3+8 = 19。

注意:

0<=m<=50
0<=n<=50
0<=k<=100



搜索的模板题,用一个bool数组g[][]维护方格能否到达,方格可以到达的条件是:在范围内、坐标的数位之和小于等于k。可以先对坐标数位之和进行预处理,使用bfs或dfs进行遍历,用ans表示可以进入的方格数量,每进入一个,ans++。

#include <bits/stdc++.h>
using namespace std;
bool g[60][60];
int n, m, k, ans;
typedef pair<int, int> P;
int d[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};

int main(){
    cin >> k >> m >> n;
    memset(g, false, sizeof(g));
    for(int i=0; i<m; i++)
        for(int j=0; j<n; j++){
            g[i][j] = true;
            int x = i, y = j;
            int t = 0;
            while(x){
                t += x%10;
                x /= 10;
            }
            while(y){
                t += y%10;
                y /= 10;
            }
            if(t>k)  // 预处理
                g[i][j] = false;
        }
    queue<P> q;
    q.push((P){0, 0});
    g[0][0] = false;
    ans = 1;
    while(!q.empty()){
        P u = q.front();
        q.pop();
        for(int i=0; i<4; i++){
            int tx = u.first+d[i][0];
            int ty = u.second+d[i][1];
            if(g[tx][ty] && tx>=0 && tx<m && ty>=0 && ty<n){
                ans++;
                g[tx][ty] = false;
                q.push((P){tx, ty});
            }
        }
    }
    cout << ans;
    return 0;
}

原文地址:https://www.cnblogs.com/gdgzliu/p/11619472.html

时间: 2024-10-03 22:29:43

[acwing#24]机器人的运动范围(BFS-DFS)的相关文章

AcWing&#160;24.&#160;机器人的运动范围

习题地址 https://www.acwing.com/solution/acwing/content/2970/ 题目描述地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼n−1. 一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格. 但是不能进入行坐标和列坐标的数位之和大于 k 的格子. 请问该机器人能够达到多少个格子? 样例 输入:k=7, m=4, n=5 输出:20 输入:k=18, m=40, n=40 输出:1484 解释:当

UVALive - 6455 Stealing Harry Potter&#39;s Precious (bfs+dfs)

https://cn.vjudge.net/problem/UVALive-6455 题目大意:题目上给出一个地图,其中@是人在地图上的出发点,#是墙,' . '是路.然后给出几个点,这些点表示财宝的所在地.问人是否能够得到所有的宝藏,如果能够的话给出所有的宝藏的最短的路径. 解题思路:由于只有最多4个宝藏所在地,所以只要用bfs找出出发点和财宝所在地距离到达其他点的步数.因为最多只有4个宝藏,所以可以暴力找出出发点到所有宝藏的最短距离. 暴力代码: 1 #include<stdio.h> 2

Collect More Jewels(hdu1044)(BFS+DFS)

Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6857    Accepted Submission(s): 1592 Problem Description It is written in the Book of The Lady: After the Creation, the cruel

hdu 4771 Stealing Harry Potter&#39;s Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4771 题目意思:'@'  表示的是起点,'#' 表示的是障碍物不能通过,'.'  表示的是路能通过的: 目的:让你从 '@' 点出发,然后每个点只能走一次,求出最小的距离: 解题思路:先用 bfs 求解出任意两点之间的距离,用 ans[i][j],表示点 i 到点  j 的距离: 然后用 dfs 递归求出从起点经过所有点的距离中,比较出最小的: AC代码: 1 #include<iostream>

SDUT--找朋友--BFS&amp;&amp;DFS

找朋友 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 X,作为户外运动的忠实爱好者,总是不想呆在家里.现在,他想把死宅Y从家里拉出来.问从X的家到Y的家的最短时间是多少. 为了简化问题,我们把地图抽象为n*n的矩阵,行编号从上到下为1 到 n,列编号从左到右为1 到 n.矩阵中'X'表示X所在的初始坐标,'Y'表示Y的位置 , '#'表示当前位置不能走,' * '表示当前位置可以通行.X每次只能向上下左右的相邻的 '*' 移

邻结矩阵的建立和 BFS,DFS;;

邻结矩阵比较简单,, 它的BFS,DFS, 两种遍历也比较简单,一个用队列, 一个用数组即可!!!但是邻接矩阵极其浪费空间,尤其是当它是一个稀疏矩阵的时候!!!---------------------------------------------------------------------------------------------------------------------------------------//邻接矩阵的建立和 其BFS, DFS, 遍历 #include <

HDU ACM 1044 Collect More Jewels BFS+DFS

题意:在一个迷宫中,有一些宝物,从起点走到终点,问在给定的时间内,到达终点后所能拾取珠宝的最大价值. 分析(BFS+DFS): 1.求入口到第一个取宝物的地方的最短距离 2.求第i个取宝物的地方到第i+1个取宝物的地方的最短距离 3.求第n个取宝物的地方到出口的最短距离 4.保证以上3点能在时间L内实现的情况下,取得的宝石价值最大. BFS特点:对于解决最短或最少问题特别有效,而且寻找深度小,但缺点是内存耗费量大(需要开大量的数组单元来存储状态) DFS特点:对于解决遍历和求所有问题有效,对于问

建图方式一 之 ”前向星“ BFS&amp;&amp;DFS 简单应用

三种建图方式,邻接矩阵.前向星(边表集).邻接链表! 耗时一晚上 ,好好研究了一下 前向星,因为我的指针用的实在是很烂,所以还是 入赘 前向星吧. 问了学长,看了大牛们的博客,终于有点收获了,个人认为 前向星Very Well. 前向星 建图方法: 以储存边的方式来储存图.在构造图时,把边存放在数组里,不需使用指针,只需一个 next  即可是整个图构建完成 . 适用条件: 点集特别多的稀疏图,边数多且繁杂,开邻接矩阵会浪费大量内存. 时间复杂度: O(m),并不比邻接链表差. #include

机器人的运动范围-剑指Offer

机器人的运动范围 题目描述 地上有一个m行和n列的方格.一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子. 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18.但是,它不能进入方格(35,38),因为3+5+3+8 = 19.请问该机器人能够达到多少个格子? 思路 这个跟“矩阵中的路径”那个题很相似,都是使用回溯法,不过这个题的起点是固定的,就是从(0,0)位置开始走 我们同样根据行