回形数矩阵 详解

回形数矩阵 时间复杂度O(n)

无构造函数 无递归 详解

题目如下:

打印一个矩阵:
当为3*3的矩阵时:

1 2 3
8 9 4
7 6 5

当为5*5的矩阵时:

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

解题步骤如下:

初始化一个空矩阵
对当前的位置进行判断,有4个可以移动的方向
但是只有一个符合规定的方向 , 用一个数字(0-3)表示下一次需要赋值的方向
0->向右移动
1->向下移动
2->向左移动
3->向上移动

按照这个方向对< i , j >坐标中的 i , j进行相应加减得到下一次的坐标
<i+1,j>或者<i-1,j>或者<i,j+1>或者<i,j-1>
再进行赋值

对于4*4的矩阵构造的坐标系:

构造的坐标系图解
代码:

public class HuiXinShu {
    public static void main(String[] args) {
        int ck = 4;//确定输入的是n*n的回形 二维数组
        int[][] Hui = new int[ck][ck];

        for (int p = 0; p < ck; p++) {
            for (int q = 0; q < ck; q++) {
                Hui[p][q] = 0;
            }
        }
        //以左上角为坐标轴的原点
        //向下是y轴正方向(也就是i)
        //向右为x轴正方向(也就是j)
        Hui[0][0] = 1;//<0,0>处为1

        for (int p = 0; p < ck; p++) {//打印初始化的图形 (可以封装成函数)
            for (int q = 0; q < ck; q++) {
                System.out.print(Hui[p][q] + " , ");
            }
            System.out.println();
        }

        System.out.println();
        System.out.println();


        int fx_int = 0;//用于存放方向的符号
        //0->向右移动
        //1->向下移动
        //2->向左移动
        //3->向上移动

        int num = 2;//需要在下个位置进行赋值 的值
        //开始赋值的地方是<0,1>
        int i = 0;
        int j = 1;
        for (int x = 1; x < Hui.length * Hui.length; x++) {//一共填入 x 平方的个数
            Hui[i][j] = num;//对这个位置进行赋值

            System.out.println("---------打印每次的图形-------------");//打印每次的图形 (可以封装成函数)
            System.out.println("<" + i + "," + j + "> : " + num);

            for (int p = 0; p < ck; p++) {
                for (int q = 0; q < ck; q++) {
                    System.out.print(Hui[p][q] + " , ");
                }
                System.out.println();
            }

            boolean islop = false;//跳出下面的循环的标志
            int n = fx_int;//下一次的次的方向 先和上次的方向一致 再顺时针进行判断
            for (int o = fx_int; o < fx_int + 4; o++) {//顺时针进行4次,如果有可以移动的方向,就跳出循环(可以封装成函数)
                if (islop) break;
                switch (n) {
                    case 0:
                        if (j + 1 < ck) {
                            if (Hui[i][j + 1] != 0) {
                                break;
                            }
                            if (Hui[i][j + 1] < num) {
                                fx_int = 0;
                                islop = true;
                                //如果满足到这里的条件,那么它下一次移动的方向为:右
                                System.out.println("<" + i + "," + j + ">后面的方向" + "+0右+");
                                break;
                            }
                        }
                        break;
                    case 1:
                        if (i + 1 < ck) {
                            if (Hui[i + 1][j] != 0) {
                                break;
                            }
                            if (Hui[i + 1][j] < num) {
                                fx_int = 1;
                                islop = true;
                                //如果满足到这里的条件,那么它下一次移动的方向为:下
                                System.out.println("<" + i + "," + j + ">后面的方向" + "+1下+");
                                break;
                            }
                        }
                        break;
                    case 2:
                        if (j - 1 >= 0) {
                            if (Hui[i][j - 1] != 0) {
                                break;
                            }
                            if (Hui[i][j - 1] < num) {
                                fx_int = 2;
                                islop = true;
                                //如果满足到这里的条件,那么它下一次移动的方向为:左
                                System.out.println("<" + i + "," + j + ">后面的方向" + "+2左+");
                                break;
                            }
                        }
                        break;
                    case 3:
                        if (i - 1 >= 0) {
                            if (Hui[i - 1][j] != 0) {
                                break;
                            }
                            if (Hui[i - 1][j] < num) {
                                fx_int = 3;
                                islop = true;
                                //如果满足到这里的条件,那么它下一次移动的方向为:上
                                System.out.println("<" + i + "," + j + ">后面的方向" + "+3上+");
                                break;
                            }
                        }
                        break;
                    default:
                        break;
                }
                n = (n + 1) % 4;
            }
			//加减得到<i+1,j>或者<i-1,j>或者<i,j+1>或者<i,j-1>
            switch (fx_int) {//根据下一次的次的方向,进行相应坐标系的加减 (可以封装成函数)
                case 0:
                    j++;
                    break;
                case 1:
                    i++;
                    break;
                case 2:
                    j--;
                    break;
                case 3:
                    i--;
                    break;
                default:
                    break;
            }
            num++;
        }


        System.out.println("---------结果-------------");//打印结果的图形 (可以封装成函数)
        for (int p = 0; p < ck; p++) {
            for (int q = 0; q < ck; q++) {
                System.out.print(Hui[p][q] + " , ");
            }
            System.out.println();
        }
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
矩阵是一种特殊的矩阵形式,它的元素按照从外到内的顺序呈螺旋状排列。在Python中,可以使用不同的方法来生成矩阵。 引用\[1\]中的代码是一种生成矩阵的方法。该方法使用了两个变量p和q来记录左上角和右下角的坐标,然后通过循环逐层向矩阵中赋值,最终得到一个矩阵。其中,判断p==q的情况是为了处理奇数和偶数的差异。 引用\[3\]中的代码是另一种生成矩阵的方法。该方法使用了数学规律来计算矩阵中每个元素的值,通过循环和条件判断来实现。这种方法使用了NumPy库来创建和操作矩阵。 你可以根据自己的需求选择其中一种方法来生成矩阵。 #### 引用[.reference_title] - *1* [2.python算法矩阵](https://blog.csdn.net/weixin_30446613/article/details/97351048)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [矩阵--python](https://blog.csdn.net/weixin_30677073/article/details/95655249)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [回型矩阵python、java](https://blog.csdn.net/qq_15745125/article/details/123632252)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值