python - 我正在尝试编写一个简短的程序来找到理想的多米诺骨牌链,想法?
问题描述
如果您不熟悉多米诺骨牌:您的游戏棋子上有两个数字。你必须把它们安排好,第一首曲子的结尾是第二首曲子的开头。因此,如果我们有 3 张多米诺骨牌,其值为 [3-1][3-4][1-4],您可以将它们排列为 [1-3]、[3-4]、[4-1] 或 [4-1 ]、[1-3]、[3-4],因为你可以切换你开始的那一面(转动图片)。
现在到我的代码问题:
我得到了一个带有多米诺骨牌值的熊猫 df:
# | D1 | D2 |
---|---|---|
1 | 1 | 5 |
2 | 2 | 4 |
3 | 3 | 6 |
4 | 4 | 1 |
5 | 3 | 4 |
6 | 2 | 3 |
7 | 6 | 5 |
dominos = {'D1': [1, 2,3,4,3,2,6], 'D2': [5,4,6,1,4,3,5]}
现在,如果我随机选择其中一个,并且需要找到一条“路线”来到达那个特定的多米诺骨牌(所选的多米诺骨牌不能旋转),从 1 开始并再次以 1 结束,同时使用尽可能少的多米诺骨牌件。
例如:选择的部分是 [3-4],代码需要打印出路线,看起来像这样(或在数组中):
1: #1 [1-5]
2: !#7 [5-6]
3: !#3 [6-3]
4: **[3-4]**
5: #4 [4-1]
到目前为止,我已经尝试使用很多for
循环来做到这一点,但没有奏效。
import pandas as pd
dominos = {'D1': [1, 2,3,4,3,2,6], 'D2': [5,4,6,1,4,3,5]}
data = pd.DataFrame(dominos)
ranD = data.loc[4,]
def findpath(data, ranD):
trargetD1 = ranD.D1
#fid possible start
for x in range(len(data)):
if data.loc[x,'D1'] == 1:
start = start + data.loc[x,]
if start.loc[x, 'D2'] == ranD.D1:
PerfectStart = start.loc[x, 'D2']
elif start.loc[x, 'D2'] != ranD.D1:
PerfectStart = start.loc[1,]
else:
print("no start found")
# when a start was found, that doesn't match ranD at pos. D2 find possible steps
for x in range(len(data)):
if PerfectStart.D2 == ranD.D2 :
step1 = step1 + data.loc[x,'D1']
if step1.loc[x, 'D2'] == ranD.D1:
PerfectStep = step1.loc[x, 'D2']
elif start.loc[x, 'D2'] != ranD.D1:
PerfectStep = step1.loc[1,]
etc.
如果有人对如何解决此问题有任何想法,请告诉我。
非常感谢您的反馈!
解决方案
您想将此视为图形问题。
您有 6 个节点(1..6),多米诺骨牌是节点之间的边。
您正在寻找一条从 1 到 1 的路径,该路径通过特定边 (a,b),并且具有最少数量的边并且不会两次通过同一边。
因此,天真的方法是寻找从 1 到 a 和从 1 到 b 的路径,并希望或强制它们不共享边。
但是,由于您选择的第一个路径阻塞了第二个路径,因此在某些设置中它不起作用。对此有一个解决方案,即最大流量。
为此,您需要将 Source 链接到容量为 2 的节点 1。a 和 b 链接到容量为 1 的 Sink。每个其他边的容量为 1。如果您解决最大流量,它的容量为 2,您可以提取路径或将具有容量 0 或 1 在这种情况下没有解决方案。
由于您只有 6 个节点,因此不必担心有一个非常有效的解决方案,因为几乎所有东西都会运行得很快。
如果您熟悉最大流量,您可能可以稍微简化一下实现。如果没有,请不要担心,尽可能实施最直接的解决方案。
推荐阅读
- php - 我的网站无法在 iphone 或 mac 上运行
- sql - PostgreSQL:SELECT 语句中“AS f(x)”子句的含义
- python - 唯一约束失败 - 完整性错误 - django
- python - 我需要一些帮助来修复我的 python 代码来计算 10-20 中所有偶数的乘积
- javascript - React Typescript - 将两个值设置为状态
- linux - 无法在远程 Linux 主机上执行命令
- c - 当值在有符号整数的正范围内时,有符号整数和无符号整数是否总是二进制相同?
- excel - 使用 SSIS 将带有数据验证列表的 Excel 文件中的数据加载到 SQL Server 数据库
- c++ - 您如何将指针指向的指针设置为 C++ 中的 nullptr?
- svelte - Svelte 是否具有渲染功能或自定义模板助手?