我正在尝试为8皇后问题创建一个棋盘。挑战是让用户输入女王的位置并告诉他们是否由于其他女王而不允许该位置。到目前为止我只有董事会
这是我到目前为止的代码:
boardsize = input('Board size: ')
rows = [[0] * int(boardsize)]
rows = str(rows).replace('[','').replace(']','').replace(',','')
for i in range(int(boardsize)):
print(i + 1, rows)
这会产生:
董事会规模:8
1 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0
4 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0
6 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0
8 0 0 0 0 0 0 0 0
我无法看到输入“Q”(象征女王)的方法,我想进入它。然后我将用Q而不是一个零重新打印电路板并重复此操作直到放置8个皇后或者没有其他女王的空间。它必须由用户控制。
答案 0 :(得分:1)
我建议您不要存储整个网格,而只是存储每行中的女王位置。这是因为每行只能存在一个女王,所以你知道这足以存储任何女王。它实际上使你的生活更容易,因为你有直接指向皇后(而不是必须遍历董事会找到皇后)。您可以使用它来执行以下操作:
sample_positions = [0, 2, 4, 1, 3, 5, None, None]
def print_positions(positions):
for ind, pos in enumerate(positions):
row = ["_"] * len(positions)
if pos is not None:
row[pos] = "Q"
print("{}: {}".format(ind, " ".join(row)))
x, y = map(int, input("Enter new queen position> ").split())
sample_positions[y] = x
print_positions(sample_positions)
这个程序运行如下:
Enter new queen position> 6 7
0: Q _ _ _ _ _ _ _
1: _ _ Q _ _ _ _ _
2: _ _ _ _ Q _ _ _
3: _ Q _ _ _ _ _ _
4: _ _ _ Q _ _ _ _
5: _ _ _ _ _ Q _ _
6: _ _ _ _ _ _ _ _
7: _ _ _ _ _ _ Q _
我已经提供了一个如何获取输入的示例(尽管您希望编写一个验证功能并首先应用它。我还用一些更多的Pythonic替换了您的打印功能 - 通常对列表的repr进行字符串操作并不是一个好主意。此外,对于此示例,输入假定x
和y
都以整数形式给出 - 您可以将其更改为字母或不管怎么说。为了简化实现,我已经把整个事情变得更加基于0了 - 我建议使用像下划线这样的空单元格而不是整数。
据推测,您 这个程序确实为它所经历的每一行构建了一个空行 - 通过一些时髦的生成器链接你可能会使这个速度快几纳秒,但这会使这个答案比现在更复杂。
这是我queens project的修改摘录。 (免责声明:我写了)。如果您希望更多地了解该表示如何工作或如何验证此模型中的电路板,请随意参考。请注意,我的项目与您的项目不同 - 我的强力所有可能的解决方案和功能没有交互式输入。
答案 1 :(得分:0)
将rows
保留为列表,只需更改相应的元素即可。不要转换为字符串;根据需要只需print
个别元素。
另外,make rows
实际上包含多行(现在你只在字符串转换之前设置了一行)。