アルゴリズム(18)学校の募集で、彼のガールフレンドの顔の質問について理解するには、[マトリックスを形成するために、バック、バック状のアクセス]

EDITORIAL:私はだった海にセーリング、ニックネームは、だけでなく、私のガールフレンドの名前の名前から来ています。私の愛の技術、オープンソースの愛、愛のプログラミング。テクノロジーは、オープンソースであり、知識が共有されています。

このブログは少し要約であり、あなたが持っている場合は、自分自身の学習を録音Javaはアルゴリズム興味は、あなたが私のダイナミックに集中することができ、私たちは一緒に学びます。

運命を変えるための知識と、私たちの家族がより良い人生を生きてみましょう


この日の午後のガールフレンドは、キャンパスの募集に行ってきました落胆帰ってきました!

ここに画像を挿入説明

I:インタビューしますか?(科学・数学ストレートの男だった誰があなたがたを許し)

彼女:。

I:インタビューの質問は、ペンを行っていませんか?

彼女:DO

I:問題は何ですか?

彼女:アルゴリズムの問題

I:あなたは主題についての話

彼女:アルゴリズムのタイトル数を取るために、フォームに戻ります

I:ああ。この問題は泣かないでしょう!

ここに画像を挿入説明

私は、分析と題し

整数は、場所マトリクスのサイズ、1,2,3 ... N * nは番号が時計螺旋の形に配置されます。

例えば:

番号2、プログラムの出力を入力します
。1 2
。4 3

番号3、プログラムの出力を入力します
。1 2 3
8 4 9。
7 6 5。

第二に、アルゴリズム解析

電流方向が望ましい多数有するか、90度の回転を取る場合は、アクセスは、蛇行状マトリックスの側面に沿ってアクセスです。右方向に、マトリックスの左上隅の始まり。値の時計回りの回転。

类似于贪吃蛇,碰到 障碍 或 边界 就要改变方向

ここに画像を挿入説明
先不急,我来给你画一张图,慢慢分析:

每一个数字当作矩阵中的一个点,输出顺序是从外圈到内圈的顺时针顺序。以最外圈为例,其输出为从(0,0)到(2,0)为红色点,其次输出是黄色点,再次输出是蓝色点,最后输出是绿色点,按照顺时针的顺序,到此外圈输出完毕。

从(0,0)点开始,开始向右取值,可以画出这样的图形
ここに画像を挿入説明

从上面的图形我们发现如下规律

x 表示列, y 表示行

输出 规律
输出第一条线上线(红色)的时候 x 逐次加一,y 不变
输出第二条线右线(黄色)的时候 y 逐次加一,x 不变
输出第三条线下线(蓝色)的时候 x 逐次减一,y 不变
输出第四条线左线(绿色)的时候 y 逐次减一,x 不变

通过以上的规律,每次输出都需要更换不同的起始点,可以通过4个 for 循环依次输出红色、黄色、蓝色、绿色四个点,直至全部输完。

关于输出矩阵,大多数人都会认为使用数组最为方便,所以这里使用二维数组来实现。

使用一个二维数组 array 来存放数据,最后遍历输出这些数据
ここに画像を挿入説明

第一圈输出完毕后,又会按上述规律循环输出第二圈。。。

:明白了没?

:明白了

:那你写一下代码,实现上面说说的逻辑

她噼里啪啦一顿操作就写完了(此处代码有bug,望耐心看完后面的)


public class RectangleTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入矩阵阶数:");
        int n = scanner.nextInt();
        printRectangle(n);
    }

	 /**
     * 回形矩阵
     *
     * @param n
     */
    private static void printRectangle(int n) {
        // 创建一个二维数组
        int[][] array = new int[n][n];
        // num 表示第几个数字
        int num = 1;

        // 外层循环 i 控制圈数,内层循环 j 控制第几条线
        for (int i = 0; i < n / 2; i++) {
            // 第一条线 上线
            // x 表示列, y 表示行
            for (int y = i, x = i; x < n - i - 1; x++) {
                array[y][x] = num++;
            }
            // 第二条线 右线
            for (int y = i, x = n - i - 1; y < n - i - 1; y++) {
                array[y][x] = num++;
            }
            // 第三条线 下线
            for (int y = n - i - 1, x = n - i - 1; x > i; x--) {
                array[y][x] = num++;
            }
            // 第四条线 左线
            for (int y = n - i - 1, x = i; y > i; y--) {
                array[y][x] = num++;
            }
        }
        
        // 遍历打印输出数字
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length; j++) {
                System.out.print(array[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

这是她写的代码,我让测试一下

ここに画像を挿入説明

她感觉很开心,我说你再输入一个3或5,再测试一下

ここに画像を挿入説明

:发现没,当输入的数字是奇数的时候,中间数字有问题。

:是不是可以做个判断,对输入的数字进行区分,当N阶矩阵是一个偶数阶的矩阵时没有矩阵中心元素,但是奇数阶矩阵有矩阵中心元素

:直接输出最后那个数字。。。

if (n % 2 == 1) {
	array[n / 2][n / 2] = num;
}

三、完整的代码实现

public class RectangleTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入矩阵阶数:");
        int n = scanner.nextInt();
        printRectangle(n);
    }

	 /**
     * 回形矩阵
     *
     * @param n
     */
    private static void printRectangle(int n) {
        // 创建一个二维数组
        int[][] array = new int[n][n];
        // num 表示要显示的数字
        int num = 1;

        // 外层循环 i 控制圈数,内层循环 j 控制第几条线
        for (int i = 0; i < n / 2; i++) {
            // 第一条线 上线
            // x 表示列, y 表示行
            for (int y = i, x = i; x < n - i - 1; x++) {
                array[y][x] = num++;
            }
            // 第二条线 右线
            for (int y = i, x = n - i - 1; y < n - i - 1; y++) {
                array[y][x] = num++;
            }
            // 第三条线 下线
            for (int y = n - i - 1, x = n - i - 1; x > i; x--) {
                array[y][x] = num++;
            }
            // 第四条线 左线
            for (int y = n - i - 1, x = i; y > i; y--) {
                array[y][x] = num++;
            }
        }

        // 对输入的阶数进行判断
        if (n % 2 == 1) {
            array[n / 2][n / 2] = num;
        }

        // 遍历打印输出数字
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length; j++) {
                System.out.print(array[i][j] + "\t");
            }
            System.out.println();
        }
    }
}

测试结果:

ここに画像を挿入説明


限られたレベルのためには、このブログは、必然的に不十分になり、私はあなたにギャング翼を懇願しました!

公開された78元の記事 ウォンの賞賛1059 ビュー12万+

おすすめ

転載: blog.csdn.net/weixin_43570367/article/details/103993738