日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

计算数独的脚本

發布時間:2024/1/8 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算数独的脚本 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

總體邏輯為:從行列上去尋找非重復值,直到找到一個可選的唯一值,重復遍歷找到最終的確認結果。

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次以上循環退出')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)

總結

以上是生活随笔為你收集整理的计算数独的脚本的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。