#--------------------------------------------------------------------------------- def print2D(S): for i in S: print(' '.join(map(str,i))) #--------------------------------------------------------------------------------- # 检测value所在的i行,j列,ij所在3*3的粗线宫格是否已有重复数字,返回true时说明没有 def check(S,i,j,value): if value in S[i]: return False for ii in range(9): if value == S[ii][j]: return False ii = i//3*3 jj = j//3*3 for r in range(ii,ii+3): for c in range(jj,jj+3): if value == S[r][c]: return False return True #--------------------------------------------------------------------------------- # 返回0值所有的行列,及长度 def ijzero(S): I = [] J = [] for i in range(9): for j in range(9): if S[i][j] == 0: I.append(i) J.append(j) return I,J,len(I) #================================================================================= input = ['0 9 2 4 8 1 7 6 3', '4 1 3 7 6 2 9 8 5', '8 6 7 3 5 9 4 1 2', '6 2 4 1 9 5 3 7 8', '7 5 9 8 4 3 1 2 6', '1 3 8 6 2 7 5 9 4', '2 7 1 5 3 8 6 4 9', '3 8 6 9 1 4 2 5 7', '0 4 5 2 7 6 8 3 1'] #S = [] #for i in range(9): # t = list(map(int,input().strip().split())) # S.append(t) S = [] for i in range(9): t = list(map(int,input[i].strip().split())) S.append(t) for i in range(4): for j in range(4): S[i][j] = 0 print2D(S) #--------------------------------------------------------------------------------- # 返回0值所有的行列,及长度 I,J,n = ijzero(S) value = [1,2,3,4,5,6,7,8,9] res = [] def dfs(k, res): if k==n: # 如达到最后一个节点 #print(res) return res # 返回第一个合法解,如无返回可打印所有合法解 if 0<=k<=n-1: # 限定搜索范围保证访问不越界 i = I[k] # 取行值 j = J[k] # 取列值 for v in value: # 遍历当前节点每个候选解 if check(S,i,j,v): # 检查当前节点当前候选解合法性 S[i][j] = v # 如合法赋值 solve_opt = dfs(k+1, res+[v]) # 递归进入下一个节点,第二个参数加入当前节点合法解。dfs()的返回值solve只有两种情况, if solve_opt: # 1、为空,说明下一个节点几个候选解check()都返回false,即本节点当前候选解不对, return solve_opt # 本节点要回溯执行下一个候选解,因此要恢复S[i][j]=0,对一下个候选解执行check() S[i][j] = 0 # 2、不为空时,说明到达终点k==n,solve返回所有路径点res solve_opt = dfs(0, res) print('solve_opt=',solve_opt) if solve_opt: print2D(S) else: print('none')