我刚刚在Python中创建了一个简单的函数,它检查数独板(输入是否作为列表给出)是否有效。我这样做的方式很简单:
检查数独板是否为9x9
检查每行只出现一次
现在,一旦我开始这个,我想利用并学习一些关于Python线程的知识。我在SO上阅读了文档,还有一些很棒的一般多线程相关帖子,但我想不出在我的检查器中实现它们的方法。
现在,我希望线程的工作方式(我认为)是一个线程,用于检查每列是否包含1-9位数,另一个用于检查相同行的行,另外9个线程用于检查每个3x3子网格。你能告诉我(最终有一些解释)我怎么能做到这一点?感谢
答案 0 :(得分:2)
所以给出一些关于如何实现这一目标的一般性指示,而不是带走任何挑战。让我们从导入线程开始:
import threading
这将让我们使用线程对象!此外,为了知道Sudoku网格在事后是否有效,我们需要一个变量来存储True / False条件。您可以选择单个变量,并使用Thread Locks确保没有其他线程访问它同时,或与三个分开。为简单起见,我将在此示例中使用三个单独的变量
LinesValid = False
ColumnsValid = False
GridsValid = False
然后,由于线程需要一个函数或另一个callable作为其目标运行,并且您需要一个用于列,行和每个3x3网格的线程,我们需要为每个线程提供三个函数。但是,由于有9列,9行和9个网格,我相信为网格做一个单独的线程会好得多,但为了练习的目的,我认为可以做一个每个
def CheckLines():
# Line Checking Code
def CheckColumns():
# ColumnCheckingCode
def CheckGrid(UpperLeft, BottomRight):
# GridCheckingCode
无论如何,我们在这里定义了三个函数,并使用适当的行检查代码。就像线条会检查X轴,列是Y轴,但想法是将它分开。对于CheckGrid,如果您希望每个磁贴都有一个线程,则需要指定角点,或者如果您决定使用单个线程,则只需将其定义为:
def CheckGrid():
# GridCheckingCode
之后我们需要制作我们的主题:
LineThread = threading.Thread(target=CheckLines)
ColumnThread = threading.Thread(target=CheckLines)
GridThread = threading.Thread(target=CheckLines, args=([0, 0], [2, 2]))
如果不需要网格,可以忽略GridThread中的参数。否则,您需要指定角点,并找到循环指定切片的方法。
之后,在向用户显示数据之前,启动线程并将它们与主线程连接是一个问题:
LineThread.start()
ColumnThread.start()
GridThread.start()
LineThread.join()
ColumnThread.join()
GridThread.join()
if sum(LinesValid, ColumnsValid, GridsValid) == 3:
print("The grid is valid!")
else:
print("The grid is invalid!")
在这里,我们检查所有Bool是否为True:( 1 + 1 + 1 ) == 3
如果是,并根据此情况向用户打印数据。这些bool在各自的Check **函数中将设置为True / False!
如果您需要一些更直接的解决方案,而不是一般性的解释方向,请告诉我,我会一起扔东西!最后一段代码看起来像这样:
import threading
def CheckLines(self):
# Line Checking Code
def CheckColumns(self):
# ColumnCheckingCode
def CheckGrid(self, UpperLeft, BottomRight):
# GridCheckingCode
LinesValid = False
ColumnsValid = False
GridsValid = False
LineThread = threading.Thread(target=CheckLines)
ColumnThread = threading.Thread(target=CheckLines)
GridThread = threading.Thread(target=CheckLines, args=([0, 0], [2, 2]))
LineThread.start()
ColumnThread.start()
GridThread.start()
LineThread.join()
ColumnThread.join()
GridThread.join()
if sum(LinesValid, ColumnsValid, GridsValid) == 3:
print("The grid is valid!")
else:
print("The grid is invalid!")