基本概述
Python实现
未优化前
class HorseChessBoard(object):
def __init__(self, size):
self.X = size
self.Y = size
self.chess_board = [[0 for col in range(size)] for row in range(size)]
self.visited = [[False for col in range(size)] for row in range(size)]
self.finished = False
def travel_chess_board(self, row: int, col: int, step: int):
"""
:param chess_board: 传入棋盘
:param row: 马儿当前的位置行 第几行,从0开始(x)
:param col: 马儿当前的位置列 第几列,从0开始(y)
:param step: 是第几步,初始位置是第1步
:return:
"""
self.chess_board[row][col] = step
self.visited[row][col] = True
next_step = self.get_next(row, col)
for p in next_step:
if not self.visited[p[0]][p[1]]:
self.travel_chess_board(p[0], p[1], step + 1)
if (step < self.X * self.Y) & (not self.finished):
self.chess_board[row][col] = 0
self.visited[row][col] = False
else:
self.finished = True
def get_next(self, x, y):
"""
返回当前位置的下一步所有可走位置集合
:return: res
"""
res = []
if (x - 1 >= 0) & (y - 2 >= 0):
res.append([x - 1, y - 2])
if (x - 2 >= 0) & (y - 1 >= 0):
res.append([x - 2, y - 1])
if (x + 1 < self.X) & (y - 2 >= 0):
res.append([x + 1, y - 2])
if (x + 2 < self.X) & (y - 1 >= 0):
res.append([x + 2, y - 1])
if (x - 2 >= 0) & (y + 1 < self.Y):
res.append([x - 2, y + 1])
if (x - 1 >= 0) & (y + 2 < self.Y):
res.append([x - 1, y + 2])
if (x + 2 < self.X) & (y + 1 < self.Y):
res.append([x + 2, y + 1])
if (x + 1 < self.X) & (y + 2 < self.Y):
res.append([x + 1, y + 2])
return res
if __name__ == '__main__':
game = HorseChessBoard(6)
game.travel_chess_board(3, 2, 1)
for rows in game.chess_board:
for steps in rows:
print(steps, end=" ")
print()
'''输出结果
8 3 6 29 32 21
5 28 9 22 15 30
2 7 4 31 20 33
27 10 1 16 23 14
36 17 12 25 34 19
11 26 35 18 13 24
'''
- 用游戏来验证一下结果:
发现完成正确哦~接下来就是进行优化!
贪心算分优化
class HorseChessBoard(object):
def __init__(self, size):
self.X = size
self.Y = size
self.chess_board = [[0 for col in range(size)] for row in range(size)]
self.visited = [[False for col in range(size)] for row in range(size)]
self.finished = False
def travel_chess_board(self, row: int, col: int, step: int):
"""
:param chess_board: 传入棋盘
:param row: 马儿当前的位置行 第几行,从0开始(x)
:param col: 马儿当前的位置列 第几列,从0开始(y)
:param step: 是第几步,初始位置是第1步
:return:
"""
self.chess_board[row][col] = step
self.visited[row][col] = True
next_step = self.get_next(row, col)
next_step.sort(key=lambda x: len(self.get_next(x[0], x[1])))
for p in next_step:
if not self.visited[p[0]][p[1]]:
self.travel_chess_board(p[0], p[1], step + 1)
if (step < self.X * self.Y) & (not self.finished):
self.chess_board[row][col] = 0
self.visited[row][col] = False
else:
self.finished = True
def get_next(self, x, y):
"""
返回当前位置的下一步所有可走位置集合
:return: res
"""
res = []
if (x - 1 >= 0) & (y - 2 >= 0):
res.append([x - 1, y - 2])
if (x - 2 >= 0) & (y - 1 >= 0):
res.append([x - 2, y - 1])
if (x + 1 < self.X) & (y - 2 >= 0):
res.append([x + 1, y - 2])
if (x + 2 < self.X) & (y - 1 >= 0):
res.append([x + 2, y - 1])
if (x - 2 >= 0) & (y + 1 < self.Y):
res.append([x - 2, y + 1])
if (x - 1 >= 0) & (y + 2 < self.Y):
res.append([x - 1, y + 2])
if (x + 2 < self.X) & (y + 1 < self.Y):
res.append([x + 2, y + 1])
if (x + 1 < self.X) & (y + 2 < self.Y):
res.append([x + 1, y + 2])
return res
if __name__ == '__main__':
game = HorseChessBoard(8)
game.travel_chess_board(1, 2, 1)
for rows in game.chess_board:
for steps in rows:
print(steps, end=" ")
print()