问题
九宫格问题,要求:
- 行列必须为相等的奇数
- 每行数字之和、每列数字之和、两个对角线数字之和,都相等
思路说明
按照下面的方式排列 横向为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<o,则b(x,y+1) (5)如果“右上”已经有值,则b(x,y+1)
解决(Python)
1. #! /usr/bin/env python2. #coding:utf-83. 4. #判断输入的九宫格的格数是否为奇数(此处未使用,目的是对所输入的数进行判断)5. def if_odd(n):6. if n%2==1:7. return True8. else:9. return False10. 11. #九宫格填写数的法则12. def sudoku_rule(n,sudoku):13. 14. tx = n/215. ty = 016. for i in range(n*n):17. sudoku[ty][tx] = i+118. tx = tx+119. ty = ty-120. if ty<0 and tx>=n: #条件(4)21. tx = tx-122. ty = ty+223. elif ty<0: #条件(3)24. ty = n-125. elif tx>=n: #条件(2)26. tx = 027. elif sudoku[ty][tx]!=0: #条件(5)28. tx = tx-129. ty = ty+230. return sudoku31. 32. if __name__=="__main__":33. n = 534. sudoku = [[0 for i in range(n)] for i in range(n)]35. s = sudoku_rule(n,sudoku)36. for line in s:37. print line
说明: 最后打印的结果和输入的九宫格格数,都可以进一步修改。
qiwsir#gmail.com (# to @)
整理人:豆包AI助手
