Добавление потоков в средство проверки судоку

#python #multithreading #python-3.x

#python #многопоточность #python-3.x

Вопрос:

Я только что создал простую функцию на Python, которая проверяет, является ли доска судоку (ввод задается в виде списка) допустимой или нет. То, как я это сделал, довольно просто:

  • проверьте, является ли доска для судоку размером 9×9

  • убедитесь, что каждое число отображается только один раз в строке

  • убедитесь, что каждое число отображается только один раз в столбце
  • убедитесь, что каждое число отображается ровно один раз в сетке 3×3

Теперь, когда я начал это делать, я хотел воспользоваться этим и немного узнать о потоках Python. Я прочитал документы, а также несколько потрясающих сообщений, связанных с многопоточностью, здесь, на SO, но я просто не мог придумать способ их реализации в моей программе проверки.

Теперь, как я хотел бы, чтобы потоки работали (как я и думал), один поток проверяет, что каждый столбец содержит 1-9 цифр, другой проверяет строки на то же самое, и еще девять потоков проверяют каждую подсетку 3×3. Не могли бы вы, ребята, рассказать мне (в конечном итоге с некоторыми объяснениями), как я мог бы этого добиться? Спасибо

Комментарии:

1. Вам нужно фиксированное количество потоков или произвольное число? Решение для X потоков отличается от решения для 9 потоков.

2. @acbabis Ну, я бы хотел, чтобы один поток для проверки столбцов, другой для проверки строк и еще 9 для этих случаев подсети 3×3. Таким образом, будет 11 потоков. Вот как я об этом подумал.

Ответ №1:

Итак, чтобы дать некоторые общие указания о том, как этого добиться, не устраняя никаких проблем. Начнем с импорта потоков:

 import threading
  

Что позволит нам использовать объекты потоков! Кроме того, чтобы узнать, будет ли сетка судоку действительной после факта, нам нужна переменная для хранения условия True / False. Вы можете либо использовать одну переменную и использовать блокировки потоков, чтобы другие потоки не обращались к ней одновременно, либо использовать три отдельных. Для простоты я буду использовать три отдельные переменные в этом примере

 LinesValid = False
ColumnsValid = False
GridsValid = False
  

Затем, поскольку потокам требуется функция или другой вызываемый объект для запуска в качестве цели, и вам нужен поток для столбцов, строк и для каждой сетки 3×3, нам нужны три функции для каждого потока. Однако, поскольку существует 9 столбцов, 9 строк, а также 9 сеток, я считаю, что было бы намного лучше просто выполнить один поток и для сеток, но для целей упражнения, я полагаю, можно сделать по одному для каждого.

 def CheckLines():
    # Line Checking Code

def CheckColumns():
    # ColumnCheckingCode

def CheckGrid(UpperLeft, BottomRight):
    # GridCheckingCode
  

В любом случае, здесь мы определяем наши три функции с соответствующим кодом проверки строк. Например, строки будут проверять ось X, а столбцы — ось Y, но идея состоит в том, чтобы разделить ее. Для контрольной сетки вам нужно будет указать углы, если вы хотите, чтобы у нее был поток для каждой плитки, или, если вы выберете один поток, вы просто определите его как:

 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!")
  

Здесь мы проверяем, все ли наши Bools верны: ( 1 1 1 ) == 3 если они есть, и печатаем данные пользователю на основе этого. Для этих bools будет установлено значение True / False в их соответствующих функциях Check **!

Если вам нужны какие-то более прямые решения, а не общее направление с объяснениями, пожалуйста, дайте мне знать, и я что-нибудь придумаю! Последняя часть кода выглядит примерно так:

 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!")
  

Комментарии:

1. Спасибо. Не могли бы вы проверить мое решение из приведенного ниже? Это решение :)?

2. Привет, возможно, я слеп, но, похоже, я не могу найти решение, на которое вы ссылаетесь?