如何解决九宫格问题
问题:
所谓九宫格问题就是在一个行数列数相等切都为奇数的方阵中,每行数字之和,每列数字之和,两个对角线数字之和都相等。
解决思路:
已经有大量资料提供这种问题的解决方法。
矩阵中元素按照下面的方式排列:
横向为x(从0到n-1),纵向为y方向(从0到n-1)
1. 第一个数放在X方向的中间位置
2. 其它数顺次放置各个位置,并依据如下原则:(假设第一个数是a,第二个数是b)
以a为中心的位置关系分别为:
左上|上|右上
左 |a | 右
左下 |下|右下
(1)b放在a的右上位置。a(x,y)–>b(x+1,y-1)
(2)如果仅有“右”位置超过边界,即x+1>n,则b(1,y-1)
(3)如果仅有“上”位置超过边界,即y-1<0,则b(x+1,n)
(4)如果“右”“上”位置都超过边界,即x+1>n,y-1
Python代码
def sudoku_rule(n,sudoku):
tx = n/2
ty = 0
for i in range(n*n):
sudoku[ty][tx] = i + 1
tx = tx+1
ty = ty-1
if ty<0 and tx>=n: #条件(4)
tx = tx-1
ty = ty+2
elif ty<0: #条件(3)
ty = n-1
elif tx>=n: #条件(2)
tx = 0
elif sudoku[ty][tx]!=0: #条件(5)
tx = tx-1
ty = ty+2
return sudoku
if __name__=="__main__":
n = 5
sudoku = [[0 for i in range(n)] for i in range(n)]
s = sudoku_rule(n,sudoku)
for line in s:
print line
Notes:
- 主函数中定义了sudoku为一个n*n的矩阵
sudoku = [[0 for i in range(n)] for i in range(n)]
这种定义方式不需要导入Numpy模块,直接使用循环的方式生成,比较原始 for line in s: print line
这种方式可以将一个矩阵编依行输出,比较美观。