题目
分析
幻方问题有两种,一种是奇数阶幻方(也是本题要解决的),一种是偶数阶幻方。
奇数阶幻方需要填充\(1-N\times N\)个数。其填写规则如下。
将1填在第一行的中间一列。然后循环处理以下步骤。
- 若\((K−1)\)在第一行但不在最后一列,则将\(K\)填在最后一行,\((K−1)\)所在列的右一列;
- 若\((K−1)\)在最后一列但不在第一行,则将\(K\)填在第一列, \((K−1)\)所在行的上一行;
- 若\((K−1)\)在第一行最后一列,则将\(K\)填在\((K−1)\)的正下方;
- 若\((K−1)\)既不在第一行,也不在最后一列,如果\((K−1)\)的右上方还未填数,则将\(K\)填在\((K−1)\)的右上方,否则将\(K\)填在\((K−1)\)的正下方。
实际编程中,可以依次递推,用x/y分别跟踪当前的位置即可。
答案

思考
这题的解法只适用于奇数阶幻方。偶数阶幻方的解法是另外一种。以下我用4阶幻方做个演示:

更多偶数幻方的解法,可以参考这篇文章。
