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

如何解决九宫格问题

问题:

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

解决思路:

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

  1. 主函数中定义了sudoku为一个n*n的矩阵
    sudoku = [[0 for i in range(n)] for i in range(n)]
    这种定义方式不需要导入Numpy模块,直接使用循环的方式生成,比较原始
  2. for line in s: print line 这种方式可以将一个矩阵编依行输出,比较美观。
    原文作者:九宫格问题
    原文地址: https://blog.csdn.net/weixin_40368377/article/details/78628358
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞