问题描述:
填数字游戏问题:
在 3×3 个方格的方阵中要填入数字 1-9,每个方格填一个整数,每个数只能填一次,使得每行每列的和相等。请问是否存在这样的填法,如果是,求出满足这个要求的数字填法。
求解思路:
1 .遍历已生成的数独二维数组,得出空白格子的数目。
2 .从第一个空白格子开始,按照题目要求的规范,检验每行每列的和,找出其所有可行解,存入数组。利用最后一个可行解,进行下一步运算。
3 .对剩下的格子进行同样的操作。
4 .如遇到无解的情况,则进行回溯操作。继续重复上述运算。
5 .当所有空白格子填满,所得结果,即为数独的解。
实现代码:
import numpy as np
grid = [[ 0,0,0],[ 0,0,0],[0,0,0]]
def possible(y, x, n):
global grid
for p in range(3):
for q in range(3):
if n == grid[p][q]:
return False
couty = 0
for i in range(3) :
if grid[y][i]>0:
couty+=1
if (couty>1) and ((grid[y][0]+grid[y][1]+ grid[y][2]+n) != 15):
couty = 0
return False
coutx = 0
for i in range(3):
if grid[i][x] > 0:
coutx += 1
if (coutx > 1) and ((grid[0][x] + grid[1][x] + grid[2][x] + n) != 15):
coutx = 0
return False
return True
def solve():
global grid
for y in range(3):
for x in range(3):
if grid[y][x] == 0:
for n in range(1, 10):
if possible(y, x, n):
grid[y][x] = n
solve()
grid[y][x] = 0
return
print(np.matrix(grid), '\n')