「芬蘭數學家因卡拉,花費3個月時間設計出了世界上迄今難度最大的數獨遊戲,而且它只有一個答案。因卡拉說只有思考能力最快、頭腦最聰明的人才能破解這個遊戲。」這是英國《每日郵報》2012年6月30日的一篇報導。
小編今天給大家分享一段Python代碼,它能解這道世界上最難的數獨,小編測試,最快2.512018秒!(可能更快)
數獨如下:
視頻如下:
("世界上最難的數獨.py"貌似打成"世界上最難的數軸.py"了。。。。。。各位看官多多見諒)
代碼如下:
import time
t0=time.time()class point: def __init__(self,x,y): self.x=x self.y=y self.available=[] self.value=0def rowNum(p,sudoku): row=set(sudoku[p.y*9:(p.y+1)*9]) row.remove(0) return row def colNum(p,sudoku): col=[] length=len(sudoku) for i in range(p.x,length,9): col.append(sudoku[i]) col=set(col) col.remove(0) return col def blockNum(p,sudoku): block_x=p.x//3 block_y=p.y//3 block=[] start=block_y*3*9+block_x*3 for i in range(start,start+3): block.append(sudoku[i]) for i in range(start+9,start+9+3): block.append(sudoku[i]) for i in range(start+9+9,start+9+9+3): block.append(sudoku[i]) block=set(block) block.remove(0) return block def initPoint(sudoku): pointList=[] length=len(sudoku) for i in range(length): if sudoku[i]==0: p=point(i%9,i//9) for j in range(1,10): if j not in rowNum(p,sudoku) and j not in colNum(p,sudoku) and j not in blockNum(p,sudoku): p.available.append(j) pointList.append(p) return pointListdef tryInsert(p,sudoku): availNum=p.available for v in availNum: p.value=v if check(p,sudoku): sudoku[p.y*9+p.x]=p.value if len(pointList)<=0: t1=time.time() useTime=t1-t0 showSudoku(sudoku) print('\nuse Time: %f s'%(useTime)) exit() p2=pointList.pop() tryInsert(p2,sudoku) sudoku[p2.y*9+p2.x]=0 sudoku[p.y*9+p.x]=0 p2.value=0 pointList.append(p2) else: pass def check(p,sudoku): if p.value==0: print('not assign value to point p!!') return False if p.value not in rowNum(p,sudoku) and p.value not in colNum(p,sudoku) and p.value not in blockNum(p,sudoku): return True else: return Falsedef showSudoku(sudoku): for j in range(9): for i in range(9): print('%d '%(sudoku[j*9+i]),end='') print('') if __name__=='__main__': sudoku=[ 8,0,0,0,0,0,0,0,0, 0,0,3,6,0,0,0,0,0, 0,7,0,0,9,0,2,0,0, 0,5,0,0,0,7,0,0,0, 0,0,0,0,4,5,7,0,0, 0,0,0,1,0,0,0,3,0, 0,0,1,0,0,0,0,6,8, 0,0,8,5,0,0,0,1,0, 0,9,0,0,0,0,4,0,0, ] pointList=initPoint(sudoku) showSudoku(sudoku) print('\n') p=pointList.pop() tryInsert(p,sudoku)
另外,小編成功在github上建了一個個人博客網站
~\(≧▽≦)/~
網址:smartchen2005.github.io
(點擊文末的閱讀原文即可訪問)
(以後會買一個簡潔的域名的!)
That's all.
btw,關注MacTrick公眾號,回復「教程」,獲取Python教程;接收更多有種有趣有料的Python文章