数独是典型的需要使用回溯算法的问题,常规写法很长,不容易缩写。
以下r方法改写自Shortest Sudoku Solver,p、q两个方法处理输出时的不同边框和空格。
最终代码有七行。
代码长度:565字节 vs. 全站第一:301字节。
import sys
b,y,z=' 0\n'
t=''.join
q=lambda x:x[0]+x[1].join([x[3:]]*3)+x[2]+z
def p(a):print(q('┏┳┓━━━┯━━━┯━━━')+t('┃ '*(i%9<1)+a[i]+b+'┃│'[i%3<2]+b+(z+([q('┠╂┨───┼───┼───'),q('┣╋┫━━━┿━━━┿━━━')][i%27>25])*(i<80))*(i%9>7)for i in range(81))+q('┗┻┛━━━┷━━━┷━━━'))
def r(a):i=a.find(y);~i or p(a);[m in[(i-j)%9*(i//9^j//9)*(i//27^j//27|i%9//3^j%9//3)or a[j]for j in range(81)]or r(a[:i]+m+a[i+1:])for m in'123456789']
r(t(sys.argv[1:]).replace('_',y))
|