首页 > 试题广场 >

机器人移动范围

[编程题]机器人移动范围
  • 热度指数:4501 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
地上有一个 m 行和 n 列的方格。一个机器人从坐标 0,0 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 k 的格子。 例如,当 k 为 18 时,机器人能够进入方格(35,37),因为 3+5+3+7 = 18 。但是,它不能进入方格(35,38),因为 3+5+3+8 = 19 。请问该机器人能够达到多少个格子?

数据范围:

输入描述:
一行三个正整数由空格分开,分别代表行数 m ,列数 n ,和坐标数位之和的阈值 k 。


输出描述:
一个正整数,代表该机器人能够到达的格子数量。
示例1

输入

3 3 6

输出

9
示例2

输入

1 1 1

输出

1
这道题不能用深度优先,迷宫很大的时候会一直往下递归,造成python递归爆炸,要用广度优先
def check(x, y, k):
    string = str(x) + str(y)
    ans = 0
    for c in string:
        ans += int(c)
    return True if ans <= k else False


def BFS(x, y):
    while queue:
        node = queue.pop(0)
        x,y = node[0], node[1]
        for dx, dy in direction:
            i = dx + x
            j = dy + y
            if 0 <= i < len(maze) and 0 <= j < len(maze[0]):
                if maze[i][j] == 0 and check(i, j, k):
                    maze[i][j] = 1
                    queue.append((i,j))



nmk = list(map(int, input().split()))
n, m, k = nmk[0], nmk[1], nmk[2]

maze = [[0] * n for i in range(m)]
direction = [(1, 0), (-1, 0), (0, -1), (0, 1)]
queue = [(0,0)]
maze[0][0] = 1
BFS(0, 0)
ans = 0
for item in maze:
    ans += sum(item)
print(ans)


发表于 2020-08-26 15:24:42 回复(0)