选择行和列唯一的列表元素列表(N Queens)

Choose list of lists element unique to row and column (N Queens)

我有一个 - 个字符列表的列表,它充当网格。

我想将每个列和行的 - 更改为 Q

这是我目前得到的:

   import pprint 
   import random # I import these classes
   grid = [['-'] for n in range(8)]
   for i in range (8):
       for j in range(8):
           inserPoint = random.randrange(8,8)
           if (j == inserPoint or i == inserPoint) and (grid[j] != 'Q' or grid[i] != 'Q'):
               grid[i][j] = ('Q')
   pprint.pprint(grid) #/ how to print one queen per line 

这是我的输出。如您所见,网格上的 Q 太多:

[['-','-','-','-','-','-','Q','-'],
 ['-','-','-','-','Q','Q','-','-']
 ['-','-','-','-','Q','-','-','-']
 ['Q','Q','-','-','-','Q','Q','-']
 ['-','-','Q','-','Q','-','-','-'].

几件事:

  1. 你的循环太多了。您可以遍历第一个索引 i,然后只需在 randrange 告诉您的位置插入 Q
  2. 你的randrange调用是错误的。它应该有开始和结束。事实上,如果您希望 Q 在行 列中是唯一的,那么 rangerange 不是合适的工具。
  3. 您的网格设置实际上并没有产生您显示的结果。

以下三项都已修复:

In [34]: size = 8
In [35]: grid = [['-' for m in range(size)] for n in range(size)]
In [36]: insertPoints = range(size) # = list(range(size)) in Python 3
In [37]: random.shuffle(insertPoints)
In [38]: for i in range(size):
   ....:     grid[i][insertPoints[i]] = "Q"

给出:

In [39]: grid
Out[39]: 
[['-', '-', '-', 'Q', '-', '-', '-', '-'],
 ['-', 'Q', '-', '-', '-', '-', '-', '-'],
 ['-', '-', '-', '-', '-', '-', 'Q', '-'],
 ['-', '-', '-', '-', '-', 'Q', '-', '-'],
 ['Q', '-', '-', '-', '-', '-', '-', '-'],
 ['-', '-', '-', '-', 'Q', '-', '-', '-'],
 ['-', '-', '-', '-', '-', '-', '-', 'Q'],
 ['-', '-', 'Q', '-', '-', '-', '-', '-']]

(请参阅 this 了解为什么在 Python 3 中打乱范围不起作用)