我想你在這裏問兩個問題。
1.如何表現這個問題,因爲Python中的圖形?
由於機器人來回移動時,他會從一個骯髒的廣場被移動到另一個,有時經過沿途的一些乾淨的空間。你的工作是弄清楚訪問髒方塊的順序。
# Code is untested and may contain typos. :-)
# A list of the (x, y) coordinates of all of the dirty squares.
dirty_squares = [(0, 4), (1, 1), etc.]
n = len(dirty_squares)
# Everywhere after here, refer to dirty squares by their index
# into dirty_squares.
def compute_distance(i, j):
return (abs(dirty_squares[i][0] - dirty_squares[j][0])
+ abs(dirty_squares[i][1] - dirty_squares[j][1]))
# distances[i][j] is the cost to move from dirty square i to
# dirty square j.
distances = []
for i in range(n):
distances.append([compute_distance(i, j) for j in range(n)])
# The x, y coordinates of where the robot starts.
start_node = (0, 0)
# first_move_distances[i] is the cost to move from the robot's
# start location to dirty square i.
first_move_distances = [
abs(start_node[0] - dirty_squares[i][0])
+ abs(start_node[1] - dirty_squares[i][1]))
for i in range(n)]
# order is a list of the dirty squares.
def cost(order):
if not order:
return 0 # Cleaning 0 dirty squares is free.
return (first_move_distances[order[0]]
+ sum(distances[order[i]][order[i+1]]
for i in range(len(order)-1)))
您的目標是找到一種方法來重新排列列表(範圍(n)),以最小化成本。
2.我如何找到移動的最小數目來解決這個問題?
正如其他人所指出的那樣,這個問題的一般形式是頑固性(NP-硬)。您有兩條信息可幫助限制問題使其易於處理:
- 該圖形是網格。
- 最多有24個髒方格。
我喜歡你的本能,在這裏使用A *。解決找到最小移動數問題通常是很好的。但是,A *需要相當數量的代碼。我認爲你最好採用分支定界方法(有時稱爲分支和剪枝(Branch-and-Prune)),它應該幾乎同樣高效,但實施起來要容易得多。
的想法是開始使用深度優先搜索枚舉所有可能的解決方案,例如:
# Each list represents a sequence of dirty nodes.
[]
[1]
[1, 2]
[1, 2, 3]
[1, 3]
[1, 3, 2]
[2]
[2, 1]
[2, 1, 3]
每次你即將遞歸到一個分支,檢查,看看是否分支比迄今爲止找到的最便宜的解決方案更昂貴。如果是這樣,你可以跳過整個分支。
如果這還不夠高效,添加一個函數來計算剩餘成本的下限。然後,如果成本([2])+ lower_bound(set([1,3]))比迄今爲止找到的最便宜的解決方案昂貴,則可以跳過整個分支。越緊的lower_bound()越多,可跳過的分支越多。
那麼,它不是一個競賽,它是一個名爲HackerRank的論壇,而且我已經明確了我對這個問題的處理方式,而且它並沒有引導我到任何地方。 – kaalobaadar
問題是否指定了有多少個正方形會變髒的限制? –
矩陣是否固定爲5 * 5? – Skyler