- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一组 NXP 堆栈,其中 N 是堆栈数,P 是堆栈容量,如何计算从位置 A 的某个节点移动到某个任意位置 B 所需的最小交换次数?我正在设计一个游戏,最终目标是对所有堆栈进行排序,使它们都具有相同的颜色。
# Let "-" represent blank spaces, and assume the stacks are
stacks = [
['R', 'R', 'R', 'R'],
['Y', 'Y', 'Y', 'Y'],
['G', 'G', 'G', 'G'],
['-', '-', '-', 'B'],
['-', 'B', 'B', 'B']
]
stacks[1][1]
处插入一个“B”使得
stacks[1] = ["-", "B", "Y", "Y"]
.我如何确定这样做所需的最小移动次数?
def calculate_min_moves(stacks, stack_ind, needs_piece, needs_index):
# Minimum moves needed to empty the stack that will receive the piece so that it can hold the piece
num_removals = 0
for s in stacks[stack_ind][:needs_index+1]:
if item != "-":
num_removals += 1
min_to_unlock = 1000
unlock_from = -1
for i, stack in enumerate(stacks):
if i != stack_ind:
for k, piece in enumerate(stack):
if piece == needs_piece:
if k < min_to_unlock:
min_to_unlock = k
unlock_from = i
num_free_spaces = 0
free_space_map = {}
for i, stack in enumerate(stacks):
if i != stack_ind and i != unlock_from:
c = stack.count("-")
num_free_spaces += c
free_space_map[i] = c
if num_removals + min_to_unlock <= num_free_spaces:
print("No shuffling needed, there's enough free space to move all the extra nodes out of the way")
else:
# HERE
print("case 2, things need shuffled")
stacks = [
['R', 'R', 'R', 'R'],
['Y', 'Y', 'Y', 'Y'],
['G', 'G', 'G', 'G'],
['-', '-', '-', 'B'],
['-', 'B', 'B', 'B']
]
Case 1: stacks[4][1] should be 'G'
Move 'B' from stacks[4][1] to stacks[3][2]
Move 'G' from stacks[2][0] to stacks[4][1]
num_removals = 0 # 'G' is directly accessible as the top of stack 2
min_to_unlock = 1 # stack 4 has 1 piece that needs removed
free_spaces = 3 # stack 3 has free spaces and no pieces need moved to or from it
moves = [[4, 3], [2, 4]]
min_moves = 2
# This is easy to calculate
Case 2: stacks[0][3] should be 'B'
Move 'B' from stacks[3][3] to stack[4][0]
Move 'R' from stacks[0][0] to stacks[3][3]
Move 'R' from stacks[0][1] to stacks[3][2]
Move 'R' from stacks[0][2] to stacks[3][1]
Move 'R' from stacks[0][3] to stacks[3][0]
Move 'B' from stacks[4][0] to stacks[0][3]
num_removals = 0 # 'B' is directly accessible
min_to_unlock = 4 # stack 0 has 4 pieces that need removed
free_spaces = 3 # If stack 3 and 4 were switched this would be 1
moves = [[3, 4], [0, 3], [0, 3], [0, 3], [0, 3], [4, 0]]
min_moves = 6
#This is hard to calculate
All Stacks: [['-', '-', 'O', 'Y'], ['-', 'P', 'P', 'O'], ['-', 'P', 'O', 'Y'], ['Y', 'Y', 'O', 'P']]
Stack 0 is currently ['-', '-', 'O', 'Y']
Stack 0 should be ['-', '-', '-', 'P']
Let S represent some solid Piece.
Stacks = [ [R, R, G], [G, G, R], [-, -, -] ]
Goal = Stacks[0][2] = R
Goal Height = 2.
Stack Height - Goal Height = 0
stack[0] = R
,游戏赢了。
GOAL
[ [ (S | -), (S | -), (S | -) ], [R, S, S], [(S | - ), (S | -), (S | -)] ]
[ [ S, S, !Goal ], [R, S, S], [-, -, -]
(0, 2), (0, 2), (0, 2), (1, 0)
Stacks = [ [R, G, G], [-, R, R], [-, -, G] ]
Goal = Stack[0][1] = R
Stack Height - Goal Height = 1
stack[1] = R
,游戏赢了。
GOAL
[ [ (S | -), (S | -), S], [ (S | -), R, S], [(S | -), (S | -), (S | -)]
[ [ S, !Goal, S], [S, R, S], [ -, -, - ]
(1, 2), (0, 2), (0, 2), (1, 0)
stacks = [ [-, R, G], [-, R, G], [-, R, G] ]
Goal = stacks[0][1] = G
(0, 1), (0, 2), (1, 0), (2, 0) = 4 Moves
(1, 0), (1, 2), (0, 1), (0, 1), (2, 0) = 5 Moves
最佳答案
我想出了两个选项,但没有一个能够及时解决案例 2。第一个选项是使用带有字符串距离度量的 A* 作为 h(n),第二个选项是 IDA*。我测试了许多字符串相似性度量,我在我的方法中使用了 smith-waterman。我已更改您的符号以更快地处理问题。我在每个数字的末尾添加了数字,以检查一块是否移动了两次。
以下是我测试过的案例:
start = [
['R1', 'R2', 'R3', 'R4'],
['Y1', 'Y2', 'Y3', 'Y4'],
['G1', 'G2', 'G3', 'G4'],
['B1'],
['B2', 'B3', 'B4']
]
case_easy = [
['R', 'R', 'R', 'R'],
['Y', 'Y', 'Y', 'Y'],
['G', 'G', 'G'],
['B', 'B'],
['B', 'B', 'G']
]
case_medium = [
['R', 'R', 'R', 'R'],
['Y', 'Y', 'Y', 'B'],
['G', 'G', 'G'],
['B'],
['B', 'B', 'G', 'Y']
]
case_medium2 = [
['R', 'R', 'R' ],
['Y', 'Y', 'Y', 'B'],
['G', 'G' ],
['B', 'R', 'G'],
['B', 'B', 'G', 'Y']
]
case_hard = [
['B'],
['Y', 'Y', 'Y', 'Y'],
['G', 'G', 'G', 'G'],
['R','R','R', 'R'],
['B','B', 'B']
]
from copy import deepcopy
from heapq import *
import time, sys
import textdistance
import os
def a_star(b, goal, h):
print("A*")
start_time = time.time()
heap = [(-1, b)]
bib = {}
bib[b.stringify()] = b
while len(heap) > 0:
node = heappop(heap)[1]
if node == goal:
print("Number of explored states: {}".format(len(bib)))
elapsed_time = time.time() - start_time
print("Execution time {}".format(elapsed_time))
return rebuild_path(node)
valid_moves = node.get_valid_moves()
children = node.get_children(valid_moves)
for m in children:
key = m.stringify()
if key not in bib.keys():
h_n = h(key, goal.stringify())
heappush(heap, (m.g + h_n, m))
bib[key] = m
elapsed_time = time.time() - start_time
print("Execution time {}".format(elapsed_time))
print('No Solution')
#shows the moves done to solve the puzzle
def rebuild_path(state):
path = []
while state.parent != None:
path.insert(0, state)
state = state.parent
path.insert(0, state)
print("Number of steps to solve: {}".format(len(path) - 1))
print('Solution')
def ida_star(root, goal, h):
print("IDA*")
start_time = time.time()
bound = h(root.stringify(), goal.stringify())
path = [root]
solved = False
while not solved:
t = search(path, 0, bound, goal, h)
if type(t) == Board:
solved = True
elapsed_time = time.time() - start_time
print("Execution time {}".format(elapsed_time))
rebuild_path(t)
return t
bound = t
def search(path, g, bound, goal, h):
node = path[-1]
time.sleep(0.005)
f = g + h(node.stringify(), goal.stringify())
if f > bound: return f
if node == goal:
return node
min_cost = float('inf')
heap = []
valid_moves = node.get_valid_moves()
children = node.get_children(valid_moves)
for m in children:
if m not in path:
heappush(heap, (m.g + h(m.stringify(), goal.stringify()), m))
while len(heap) > 0:
path.append(heappop(heap)[1])
t = search(path, g + 1, bound, goal, h)
if type(t) == Board: return t
elif t < min_cost: min_cost = t
path.pop()
return min_cost
class Board:
def __init__(self, board, parent=None, g=0, last_moved_piece=''):
self.board = board
self.capacity = len(board[0])
self.g = g
self.parent = parent
self.piece = last_moved_piece
def __lt__(self, b):
return self.g < b.g
def __call__(self):
return self.stringify()
def __eq__(self, b):
if self is None or b is None: return False
return self.stringify() == b.stringify()
def __repr__(self):
return '\n'.join([' '.join([j[0] for j in i]) for i in self.board])+'\n\n'
def stringify(self):
b=''
for i in self.board:
a = ''.join([j[0] for j in i])
b += a + '-' * (self.capacity-len(a))
return b
def get_valid_moves(self):
pos = []
for i in range(len(self.board)):
if len(self.board[i]) < self.capacity:
pos.append(i)
return pos
def get_children(self, moves):
children = []
for i in range(len(self.board)):
for j in moves:
if i != j and self.board[i][-1] != self.piece:
a = deepcopy(self.board)
piece = a[i].pop()
a[j].append(piece)
children.append(Board(a, self, self.g+1, piece))
return children
initial = Board(start)
final1 = Board(case_easy)
final2 = Board(case_medium)
final2a = Board(case_medium2)
final3 = Board(case_hard)
x = textdistance.gotoh.distance
a_star(initial, final1, x)
a_star(initial, final2, x)
a_star(initial, final2a, x)
ida_star(initial, final1, x)
ida_star(initial, final2, x)
ida_star(initial, final2a, x)
关于python - 如何找到将项目移动到堆栈中某个位置的最小移动次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60824715/
我正在处理一组标记为 160 个组的 173k 点。我想通过合并最接近的(到 9 或 10 个组)来减少组/集群的数量。我搜索过 sklearn 或类似的库,但没有成功。 我猜它只是通过 knn 聚类
我有一个扁平数字列表,这些数字逻辑上以 3 为一组,其中每个三元组是 (number, __ignored, flag[0 or 1]),例如: [7,56,1, 8,0,0, 2,0,0, 6,1,
我正在使用 pipenv 来管理我的包。我想编写一个 python 脚本来调用另一个使用不同虚拟环境(VE)的 python 脚本。 如何运行使用 VE1 的 python 脚本 1 并调用另一个 p
假设我有一个文件 script.py 位于 path = "foo/bar/script.py"。我正在寻找一种在 Python 中通过函数 execute_script() 从我的主要 Python
这听起来像是谜语或笑话,但实际上我还没有找到这个问题的答案。 问题到底是什么? 我想运行 2 个脚本。在第一个脚本中,我调用另一个脚本,但我希望它们继续并行,而不是在两个单独的线程中。主要是我不希望第
我有一个带有 python 2.5.5 的软件。我想发送一个命令,该命令将在 python 2.7.5 中启动一个脚本,然后继续执行该脚本。 我试过用 #!python2.7.5 和http://re
我在 python 命令行(使用 python 2.7)中,并尝试运行 Python 脚本。我的操作系统是 Windows 7。我已将我的目录设置为包含我所有脚本的文件夹,使用: os.chdir("
剧透:部分解决(见最后)。 以下是使用 Python 嵌入的代码示例: #include int main(int argc, char** argv) { Py_SetPythonHome
假设我有以下列表,对应于及时的股票价格: prices = [1, 3, 7, 10, 9, 8, 5, 3, 6, 8, 12, 9, 6, 10, 13, 8, 4, 11] 我想确定以下总体上最
所以我试图在选择某个单选按钮时更改此框架的背景。 我的框架位于一个类中,并且单选按钮的功能位于该类之外。 (这样我就可以在所有其他框架上调用它们。) 问题是每当我选择单选按钮时都会出现以下错误: co
我正在尝试将字符串与 python 中的正则表达式进行比较,如下所示, #!/usr/bin/env python3 import re str1 = "Expecting property name
考虑以下原型(prototype) Boost.Python 模块,该模块从单独的 C++ 头文件中引入类“D”。 /* file: a/b.cpp */ BOOST_PYTHON_MODULE(c)
如何编写一个程序来“识别函数调用的行号?” python 检查模块提供了定位行号的选项,但是, def di(): return inspect.currentframe().f_back.f_l
我已经使用 macports 安装了 Python 2.7,并且由于我的 $PATH 变量,这就是我输入 $ python 时得到的变量。然而,virtualenv 默认使用 Python 2.6,除
我只想问如何加快 python 上的 re.search 速度。 我有一个很长的字符串行,长度为 176861(即带有一些符号的字母数字字符),我使用此函数测试了该行以进行研究: def getExe
list1= [u'%app%%General%%Council%', u'%people%', u'%people%%Regional%%Council%%Mandate%', u'%ppp%%Ge
这个问题在这里已经有了答案: Is it Pythonic to use list comprehensions for just side effects? (7 个答案) 关闭 4 个月前。 告
我想用 Python 将两个列表组合成一个列表,方法如下: a = [1,1,1,2,2,2,3,3,3,3] b= ["Sun", "is", "bright", "June","and" ,"Ju
我正在运行带有最新 Boost 发行版 (1.55.0) 的 Mac OS X 10.8.4 (Darwin 12.4.0)。我正在按照说明 here构建包含在我的发行版中的教程 Boost-Pyth
学习 Python,我正在尝试制作一个没有任何第 3 方库的网络抓取工具,这样过程对我来说并没有简化,而且我知道我在做什么。我浏览了一些在线资源,但所有这些都让我对某些事情感到困惑。 html 看起来
我是一名优秀的程序员,十分优秀!