输入9行,每行为空格隔开的9个数字,为0的地方就是需要填充的数字。
输出九行,每行九个空格隔开的数字,为解出的答案。
0 9 0 0 0 0 0 6 0 8 0 1 0 0 0 5 0 9 0 5 0 3 0 4 0 7 0 0 0 8 0 7 0 9 0 0 0 0 0 9 0 8 0 0 0 0 0 6 0 2 0 7 0 0 0 8 0 7 0 5 0 4 0 2 0 5 0 0 0 8 0 7 0 6 0 0 0 0 0 9 0
7 9 3 8 5 1 4 6 2 8 4 1 2 6 7 5 3 9 6 5 2 3 9 4 1 7 8 3 2 8 4 7 6 9 5 1 5 7 4 9 1 8 6 2 3 9 1 6 5 2 3 7 8 4 1 8 9 7 3 5 2 4 6 2 3 5 6 4 9 8 1 7 4 6 7 1 8 2 3 9 5
用例为:
0 0 8 7 1 9 2 4 5 9 0 5 2 3 4 0 8 6 0 7 4 8 0 6 1 0 3 7 0 3 0 9 2 0 0 0 5 0 0 0 0 0 0 0 0 8 6 1 4 0 3 5 2 9 4 0 0 0 2 0 0 0 8 0 0 0 0 0 0 0 7 0 1 0 7 0 6 8 0 5 0
答案为(第7,8行不一样):
6 3 8 7 1 9 2 4 5 9 1 5 2 3 4 7 8 6 2 7 4 8 5 6 1 9 3 7 4 3 5 9 2 8 6 1 5 9 2 6 8 1 4 3 7 8 6 1 4 7 3 5 2 9 4 5 6 3 2 7 9 1 8 3 8 9 1 4 5 6 7 2 1 2 7 9 6 8 3 5 4 6 3 8 7 1 9 2 4 5 9 1 5 2 3 4 7 8 6 2 7 4 8 5 6 1 9 3 7 4 3 5 9 2 8 6 1 5 9 2 6 8 1 4 3 7 8 6 1 4 7 3 5 2 9 4 5 9 3 2 7 6 1 8 3 8 6 1 4 5 9 7 2 1 2 7 9 6 8 3 5 4
对应第二个答案的代码如下:
#!/usr/bin/env python #ret = [[i for i in range(9)] for i in range(9)] nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ret = [] for i in range(9): ret1 = map(int, raw_input().split()) ret.append(ret1) #ret = [[5, 0, 0, 9, 2, 0, 7, 0, 0], [0, 7, 0, 3, 4, 0, 8, 0, 0], [0, 2, 0, 0, 1, 0, 0, 5, 0], [7, 0, 4, 0, 6, 0, 1, 0, 0], [6, 0, 2, 1, 8, 3, 9, 4, 0], [0, 9, 0, 7, 5, 4, 0, 0, 8], [0, 0, 5, 8, 3, 6, 0, 7, 9], [0, 3, 9, 0, 7, 2, 6, 0, 1], [8, 0, 0, 4, 9, 1, 5, 2, 3]] def func1(arr): for i in range(len(arr)): if 0 in arr[i]: return False return True #get existed num set, including 0 def func2(arr, row, col): lst = list(arr[row]) i1 = ((row+3)/3 - 1) * 3 j1 = ((col+3)/3 - 1) * 3 for i in range(9): lst.append(arr[i][col]) for i in range(i1, i1+3): for j in range(j1, j1+3): lst.append(arr[i][j]) #print "func2----------------------" #print row, col, lst lst = list(set(lst)) return lst def print_matrix(arr): for i in range(9): print ' '.join(map(str, arr[i])) def func(arr, row, col): if func1(arr): lst = func2(arr, row, col) if len(lst) == 9: #print_matrix(arr) return True else: return False else: #arr1 = copy.deepcopy(arr) for i in range(9): for j in range(9): if arr[i][j] == 0: lst = func2(arr, i, j) lst_rest = list(set(nums) - set(lst)) #print i, j, lst, lst_rest if not lst_rest: return False for n in lst_rest: arr[i][j] = n if func(arr, i, j): return True else: arr[i][j] = 0 return False func(ret, 0, 0) print_matrix(ret)