資源簡介
利用Python程序求解任意可解數獨,同時輸出整個求解過程,文件中包含幾個測試用例,其中有世界最難數獨的求解結果

代碼片段和文件信息
import?os
import?numpy?as?np
def?deep_copy(nparray):
????assert?np.ndim(nparray)?==?2?““
????shape?=?np.shape(nparray)
????ret?=?np.zeros(shape?dtype=np.object)
????for?i?in?range(shape[0]):
????????for?j?in?range(shape[1]):
????????????ret[i?j]?=?nparray[i?j].copy()
????return?ret
def?get_cell_index(row?col):
????ret_index?=?[0?0]
????if?3?<=?row?6:
????????ret_index[0]?=?1
????elif?row?>=?6:
????????ret_index[0]?=?2
????if?3?<=?col?6:
????????ret_index[1]?=?1
????elif?col?>=?6:
????????ret_index[1]?=?2
????return?ret_index
def?check_row(num?array?row):
????if?len(np.where(array[row?:]?==?num)[0])?==?0:
????????return?True
????return?False
def?check_col(num?array?col):
????if?len(np.where(array[:?col]?==?num)[0])?==?0:
????????return?True
????return?False
def?check_cell(num?array?row?col):
????cell_index?=?get_cell_index(row?col)
????if?len(np.where(array[cell_index[0]*3:(cell_index[0]+1)*3
????????????????????cell_index[1]*3:(cell_index[1]+1)*3]?==?num)[0])?==?0:
????????return?True
????return?False
def?start_init(array):
????lengths?=?np.zeros([9?9])??????????#?每個位置可能填寫的值的個數
????may_nums?=?np.zeros([9?9]?dtype=list)?????#?每個位置可能填寫的所有值組成的list
????for?i?in?range(9):
????????for?j?in?range(9):
????????????if?array[i?j]?>?0:
????????????????may_nums[i?j]?=?[]
????????????????continue
????????????may_nums[i?j]?=?[k?for?k?in?range(1?10)
??????????????????????????????if?check_row(k?array?i)
??????????????????????????????and?check_col(k?array?j)
??????????????????????????????and?check_cell(k?array?i?j)]
????????????lengths[i?j]?=?len(may_nums[i?j])
????return?lengths?may_nums
def?update_maynums(lengths?may_nums?row?col?val):
????for?i?in?range(9):
????????if?i?==?row:
????????????continue
????????if?val?in?may_nums[i?col]:
????????????may_nums[i?col].remove(val)
????????????lengths[i?col]?-=?1
????????????if?lengths[i?col]?==?0:
????????????????return?True
????for?i?in?range(9):
????????if?i?==?col:
????????????continue
????????if?val?in?may_nums[row?i]:
????????????may_nums[row?i].remove(val)
????????????lengths[row?i]?-=?1
????????????if?lengths[row?i]?==?0:
????????????????return?True
????cell_index?=?get_cell_index(row?col)
????for?i?in?range(cell_index[0]?*?3?(cell_index[0]?+?1)?*?3):
????????for?j?in?range(cell_index[1]?*?3?(cell_index[1]?+?1)?*?3):
????????????if?i?==?row?and?j?==?col:
????????????????continue
????????????if?val?in?may_nums[i?j]:
????????????????may_nums[i?j].remove(val)
????????????????lengths[i?j]?-=?1
????????????????if?lengths[i?j]?==?0:
????????????????????return?True
????return?False
????#?return?lengths?may_nums
def?check_only_chance_rows(array?lengths?may_nums?per_step?outf):
????updated?=?False
????wrong?=?False
????for?i?in?range(9):
????????may_nums_row?=?may_nums[i?0]
????????length?=?len(may_nums_row)
????????only_chance_index?=?list()
??
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????12862??2018-12-23?00:18??sudoku_v3.py
?????文件?????444805??2019-01-23?23:30??sudoku_inputs\hardest.res
?????文件????????169??2018-12-22?10:41??sudoku_inputs\hardest.txt
?????文件??????12208??2018-12-22?10:36??sudoku_inputs\大師10.res
?????文件????????169??2018-12-22?10:36??sudoku_inputs\大師10.txt
?????文件??????11118??2018-12-21?23:54??sudoku_inputs\大師3.res
?????文件????????169??2018-12-21?23:36??sudoku_inputs\大師3.txt
?????文件??????11554??2018-12-22?00:43??sudoku_inputs\大師4.res
?????文件????????169??2018-12-21?15:43??sudoku_inputs\大師4.txt
?????文件??????11554??2018-12-22?10:27??sudoku_inputs\大師5.res
?????文件????????169??2018-12-22?10:18??sudoku_inputs\大師5.txt
?????文件??????11772??2018-12-22?10:29??sudoku_inputs\大師9.res
?????文件????????169??2018-12-22?10:29??sudoku_inputs\大師9.txt
?????目錄??????????0??2019-01-23?23:30??sudoku_inputs
-----------?---------??----------?-----??----
???????????????516887????????????????????14
- 上一篇:python程序設計基礎課件
- 下一篇:12306爬蟲實現
評論
共有 條評論