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();
}
}
}
测试结果:
限られたレベルのためには、このブログは、必然的に不十分になり、私はあなたにギャング翼を懇願しました!