奇数阶魔方阵算法分析

3 篇文章 0 订阅
2 篇文章 0 订阅

奇数阶魔方阵就是指行列数都是吧n(n>=3 且 n%2 == 1)的魔方阵

奇数阶魔方阵的数字规律
通过对奇数阶魔方阵的分析,其中的数字排列有如下的规律:
(1)自然数1出现在第一行的正中间;
(2)若填入的数字在第一行(不在第n列),则下一个数字在第n行(最后一行)且列数加1(列数右移一列);
(3)若填入的数字在该行的最右侧,则下一个数字就填在上一行的最左侧;
(4)一般地,下一个数字在前一个数字的右上方(行数少1,列数加1);
(5)若应填的地方已经有数字或在方阵之外,则下一个数字就填在前一个数字的下方。(一般地,n的倍数的下一个数字是在该数的下方。)
按照上述的规律,我们来完成3阶的魔方阵:
第一步:将“1”填入1行2列的位置,即 (按规律(1));
第二步:将“2”填入3 (最后) 行3 ( = 2 + 1 )列的位置,即 (按规律(2));
第三步:将“3”填入2行1列的位置,即 (按规律(3));
第四步:将“4”填入3行1列的位置(“3”的下面);即 (按规律(5))
第五步:将“5”填入2行2列的位置;即 (按规律(4));
第六步:将“6”填入1行3列的位置,即 (按规律(4));
第七步:将“7”填入2行3列的位置(“6”的下面),即 (按规律(5));
第八步:将“8”填入1行1列的位置,即 (按规律(3));
第九步:将“9”填入3行2列的位置,即 (按规律(2))。
至此,一个3阶魔方阵构造完成了。

下面我们根据奇数阶魔方阵的的数字规律通过代码来做一下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JSJMFZ
{
    class Program
    {
        static void Main(string[] args)
        {
            Test();
            Console.ReadLine();
        }
        /// <summary>
        /// 这是一个奇数阶魔方矩阵算法
        /// </summary>
        static void Test() {
            const int row = 5;
            int[,] nums = new int[row, row];
            int rowIndex = 0;
            int colIndex = 0;
            //自然数1出现在第一行的正中间
            nums[0, row / 2] = 1;
            rowIndex = 0;
            colIndex = row / 2;
            for (int i = 2; i <= row * row; i++) {
                //若填入的数字在第一行且不在最后n列,则下一个数字
                //在第n行且列数加1
                if (rowIndex == 0 && colIndex != row - 1 ) {
                    rowIndex = row - 1;
                    colIndex = colIndex + 1;
                    nums[rowIndex, colIndex] = i;
                    continue;
                }
                //若填入的数字在该行的最右侧且不在第一行,则下一个数字就在上一行的最左侧
                if (colIndex == row - 1 && rowIndex != 0) {
                    rowIndex = rowIndex - 1;
                    colIndex = 0;
                    nums[rowIndex, colIndex] = i;
                    continue;
                }
                //若应填的地方已经有数字或者在方阵之处,则下一个数字就填在前一个数字的下方
                //一般的n的倍数的下一个数字是在该数的下方
                if (rowIndex ==0 || colIndex == row -1 || nums[rowIndex - 1, colIndex + 1] != 0)
                {
                    rowIndex = rowIndex + 1;
                    nums[rowIndex, colIndex] = i;
                }
                else {
                    //一般的,下一个数字在前一个数字的右上方(行数减1,列数加1)
                    rowIndex -= 1;
                    colIndex += 1;
                    nums[rowIndex, colIndex] = i;
                }
                
            }


            for (int i = 0; i < row; i++) {
                for (int j = 0; j < row; j++) {
                    Console.Write(nums[i, j]+"\t");
                }
                Console.WriteLine();
            }
        }
    }
}

这样,我们就可以通过程序来随意的生成一个方法矩阵了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yy763496668

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值