Python实现一些简单的算法(5)—九宫格问题

来源:互联网 发布:dnf优化不卡补丁2017 编辑:程序博客网 时间:2024/06/04 17:48

如何解决九宫格问题

问题:

所谓九宫格问题就是在一个行数列数相等切都为奇数的方阵中,每行数字之和,每列数字之和,两个对角线数字之和都相等。

解决思路:

已经有大量资料提供这种问题的解决方法。
矩阵中元素按照下面的方式排列:
横向为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 sudokuif __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:

  1. 主函数中定义了sudoku为一个n*n的矩阵
    sudoku = [[0 for i in range(n)] for i in range(n)]
    这种定义方式不需要导入Numpy模块,直接使用循环的方式生成,比较原始
  2. for line in s: print line 这种方式可以将一个矩阵编依行输出,比较美观。
原创粉丝点击