跳马
题目描述
输入 m 和 n 两个数, m 和 n 表示一个 m*n 的棋盘. 输入棋盘内的数据. 棋盘中存在数字和.
两种字符, 如果是数字表示该位置是一匹马, 如果是.
表示该位置为空的, 棋盘内的数字表示为该马能走的最大步数.
例如棋盘内某个位置一个数字为 k, 表示该马只能移动 1~k 步的距离.
棋盘内的马移动类似于中国象棋中的马移动, 先在水平或者垂直方向上移动一格, 然后再将其移动到对角线位置.
棋盘内的马可以移动到同一个位置, 同一个位置可以有多匹马.
请问能否将棋盘上所有的马移动到同一个位置, 若可以请输入移动的最小步数. 若不可以输出 0.
输入描述
输入 m 和 n 两个数, m 和 n 表示一个 m*n 的棋盘. 输入棋盘内的数据. 棋盘中存在数字和.
两种字符, 如果是数字表示该位置是一匹马, 如果是 .
表示该位置为空的, 棋盘内的数字表示为该马能走的最大步数.
例如棋盘内某个位置一个数字为 k, 表示该马只能移动 1~k 步的距离.
棋盘内的马移动类似于中国象棋中的马移动, 先在水平或者垂直方向上移动一格, 然后再将其移动到对角线位置.
棋盘内的马可以移动到同一个位置, 同一个位置可以有多匹马.
请问能否将棋盘上所有的马移动到同一个位置, 若可以请输入移动的最小步数, 若不可以输出 0.
输出描述
能否将棋盘上所有的马移动到同一个位置, 若可以请输入移动的最小步数, 若不可以输出 0.
示例1
输入:
3 2
. .
2 .
. .
输出:
0
示例2
输入:
3 5
4 7 . 4 8
4 7 4 4 .
7 . . . .
输出:
17
题解
Python
from collections import deque
def main():
# 读取行列值
rows, columns = list(map(int, input().split()))
horse_matrix = []
for row in range(rows):
parts = input().split()
for column in range(columns):
if parts[column] != ".":
# 马可以移动的最大步数
steps = int(parts[column])
horse_matrix.append((row, column, steps))
# 可以移动的方向
directions = ((-1, -2), (-1, 2), (1, -2), (1, 2), (-2, -1), (-2, 1), (2, -1), (2, 1))
INITIAL_STEPS = 10 ** 9
def dfs(row, column, x, y, max_move_steps, dist, visited):
if row == x and column == y:
return dist
# 访问所有的方向
for dx, dy in directions:
x2 = x + dx
y2 = y + dy
# 检查新的坐标位置是否有效, 是否访问过
if 0 <= x2 < rows and 0 <= y2 < columns and dist < max_move_steps and (x2, y2) not in visited:
visited.add((x2, y2))
steps = dfs(row, column, x2, y2, max_move_steps, dist + 1, visited)
if steps > -1:
return steps
return -1
min_steps = INITIAL_STEPS
# 遍历每个位置
for row in range(rows):
for column in range(columns):
# 所有马移动的总步数
total_steps = 0
possible_move = True
# 遍历每只马
for x, y, move_steps in horse_matrix:
visited = set()
steps = dfs(row, column, x, y, move_steps, 0, visited)
print("steps:", steps)
if steps > -1:
total_steps += steps
break
else:
possible_move = False
if possible_move:
print("total steps:", total_steps)
min_steps = min(min_steps, total_steps)
print("min_steps:", min_steps)
if __name__ == "__main__":
main()