计算数独的脚本
總體邏輯為:從行列上去尋找非重復(fù)值,直到找到一個(gè)可選的唯一值,重復(fù)遍歷找到最終的確認(rèn)結(jié)果。
import mathclass sudoku():def __init__(self, sudo_list):self.sudo_list = sudo_listself.init_range = set([x for x in range(1, 10)])def _init_list(self):self.sudo_list_bak = [[0 for x in range(9)] for y in [0 for x in range(9)]]for row in range(9):for column in range(9):bak_dict = {}bak_dict['value'] = self.sudo_list[row][column]block = (math.floor(row / 3) + 1, math.floor(column / 3) + 1)bak_dict["row"] = rowbak_dict["column"] = columnbak_dict["block"] = blockself.sudo_list_bak[row][column] = bak_dictfor row in range(9):for column in range(9):current_dict = self.sudo_list_bak[row][column]# print(row,column,current_dict)if current_dict['value'] == 0:current_dict['bakvalue'] = self.init_range.copy()current_dict['bakvalue'] = self._getback_value(current_dict['row'], current_dict['column'],current_dict['block'])def _getback_value(self, row, column, block):row_value = self._getback_row_value(row)column_value = self._getback_column_value(column)block_value = self._getback_block_value(row, column)return row_value.intersection(column_value, block_value)def _getback_row_value(self, row):exists_value_list = [i["value"] for i in self.sudo_list_bak[row]]row_value = self.init_range.copy()for i in exists_value_list:row_value.discard(i)return row_valuedef _getback_column_value(self, column):exists_value_list = [i[column]["value"] for i in self.sudo_list_bak]column_value = self.init_range.copy()for i in exists_value_list:column_value.discard(i)return column_valuedef _getback_block_value(self, row, block):exists_value_list = []for x in self.sudo_list_bak:for y in x:if y["block"] == block:y['value'].append(exists_value_list)block_value = self.init_range.copy()for i in exists_value_list:block_value.discard(i)return block_valuedef compli_judge(self):for x in self.sudo_list_bak:for y in x:if y['value'] == 0:return Truereturn Falsedef loop(self):a = 0while self.compli_judge():for x in self.sudo_list_bak:for y in x:if y['value'] == 0 and len(y['bakvalue']) == 1:y['value'] = list(y['bakvalue'])[0]y.pop('bakvalue')for x_new in self.sudo_list_bak:for y_new in x_new:if y_new['value'] == 0 and (y_new['row'] == y['row'] or y_new['column'] == y['column'] or y_new['block'] ==y["block"]):y_new['bakvalue'].discard(y['value'])a += 1if a == 10:print('10次以上循環(huán)退出')breakdef result(self):self._init_list()self.loop()for x in range(9):for y in range(9):self.sudo_list[x][y] = self.sudo_list_bak[x][y]['value']return self.sudo_listdef result(self):return self.sudo_listif __name__ == '__main__':sudolist = [[5, 0, 2, 4, 0, 0, 9, 0, 1],[0, 6, 0, 0, 0, 1, 2, 0, 0],[0, 9, 0, 0, 0, 0, 7, 8, 3],[0, 0, 0, 0, 8, 4, 0, 3, 9],[0, 0, 0, 1, 2, 7, 0, 0, 5],[4, 8, 0, 5, 9, 0, 6, 0, 7],[2, 0, 6, 0, 1, 5, 3, 9, 8],[0, 1, 3, 0, 0, 2, 5, 7, 0],[0, 0, 7, 0, 0, 0, 4, 0, 0]]sudo = sudoku(sudolist)reuslt_list = sudo.result()for x in range(9):if x % 3 == 0:print("—" * 21)for y in range(9):if y % 3 == 0:print("|", end="")print(reuslt_list[x][y], end=" ")print("")print("—" * 21)總結(jié)
- 上一篇: 为fetch添加拦截器功能
- 下一篇: 《流浪地球》地下城怎么建?三维地学建模探