使用数组打印蛇形图案

huangapple go评论75阅读模式
英文:

Printing a snake pattern using an array

问题

以下是翻译好的部分:

//蛇形移动带有数字
import java.util.Scanner;

public class SnakeMove {
    public static void main(String[] args) {
        //创建 Scanner 对象
        Scanner inScan = new Scanner(System.in);

        //提示用户从 0 到 16 选择行数
        System.out.println("选择行数,范围从 0 到 16。");

        //使用 nextInt() 方法从用户获取输入
        //使用变量 int row
        int row = inScan.nextInt();

        //提示用户从 0 到 16 选择列数
        System.out.println("选择列数,范围从 0 到 16。");

        //使用 nextInt() 方法从用户获取输入
        //使用变量 int col
        int col = inScan.nextInt();
        if (row != col) {
            System.out.println("再次运行程序,选择相同的行数和列数。");
            System.exit(0);
        }
        int[][] arr = move(row, col);
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length; j++) {
                System.out.print(arr[i][j] + "  ");
            }
            System.out.println();
        }
    }//main 方法

    static int[][] move(int row, int col) {
        boolean flag = true;
        int count = 1;
        int[][] array = new int[row][col];
        for (int j = 0; j < array[0].length; j++) {
            if (flag) {
                for (int i = 0; i < array.length; i++) {
                    //将 count 的增量值赋值给特定的数组单元
                    array[i][j] = count;
                    count++;
                }
                flag = false;
            } else {
                //逐行递减向上移动
                for (int i = array.length - 1; i > 0; i--) {
                    //将 count 的增量值赋值给特定的数组单元
                    array[i][j] = count;
                    count++;
                }
                flag = true;
            }
        }//逐列增加
        return array;
    }//move 方法
}//结束 SnakeMove 类
英文:

I'm having trouble with an assignment where we are required to print out this array:

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

My code is somewhat correct but it is not printing 10 and 19 where it should be.

My output:

Choose a number for the rows from 0 to 16.
5
Choose a number for the columns from 0 to 16
5
1  0  10  0   19
2  9  11  18  20
3  8  12  17  21
4  7  13  16  22
5  6  14  15  23

My code:

//snake move with the number
import java.util.Scanner;

public class SnakeMove {
    public static void main(String[] args) {
        //create Scanner object
        Scanner inScan = new Scanner(System.in);

        //prompt the user to choose number for the Row from 0 to 16
        System.out.println(&quot;Choose a number for the rows from 0 to 16.&quot;);

        //take the input from user with nextInt() method
        //use the variable int row
        int row = inScan.nextInt();

        //prompt the user to choose number for the Col from 0 to 16
        System.out.println(&quot;Choose a number for the columns from 0 to 16&quot;);

        //take the input from user with nextInt()
        //use the variable int col
        int col = inScan.nextInt();
        if (row != col) {
            System.out.println(&quot;Run the program again and choose the same number for Row and Col&quot;);
            System.exit(0);
        }
        int[][] arr = move(row, col);
        for (int i = 0; i &lt; arr.length; i++) {
            for (int j = 0; j &lt; arr.length; j++) {
                System.out.print(arr[i][j] + &quot;  &quot;);
            }
            System.out.println();
        }
    }//main method

    static int[][] move(int row, int col) {
        boolean flag = true;
        int count = 1;
        int[][] array = new int[row][col];
        for (int j = 0; j &lt; array[0].length; j++) {
            if (flag) {
                for (int i = 0; i &lt; array.length; i++) {
                    //assign the increment value of count
                    // to specific array cells
                    array[i][j] = count;
                    count++;
                }
                flag = false;
            } else {
                //row decrement going up
                for (int i = array.length - 1; i &gt; 0; i--) {
                    //assign the increment value of count
                    // to specific array cells
                    array[i][j] = count;
                    count++;
                }
                flag = true;
            }
        }//column increment
        return array;
    }//move method
}//end SnakeMove class

Can anyone detect what is causing the error? Any help would be appreciated.

答案1

得分: 1

我认为这是一个不错的替代方案,容易理解。如果你有同样问题的简化版本,请评论分享。

## 代码:##

import java.util.Arrays;
import java.util.Scanner;

public class SnakePatternProblem {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);   // *输入*
        int row = scanner.nextInt();
        int col = scanner.nextInt();
        int[][] array = new int[row][col];

        // 用通用表达式初始化数组的第一行

        for (int i = 0; i < col; i++) {
            if (i % 2 != 0) array[0][i] = col * (i+1); 
            else array[0][i] = (col * i) + 1;
        }

        array[0][0] = 1; // 此元素不在上述循环中涵盖。

        // 嵌套循环用于根据第一行元素递增和递减。

        for (int i = 1; i < row; i++) {
            for (int j = 0; j < col; j++) {
                if (j % 2 == 0) array[i][j] = array[i-1][j] + 1;
                else array[i][j] = array[i-1][j] - 1;
            }
        }
        System.out.println(Arrays.deepToString(array));    // *输出*
    }
}


----------

## 解释:##

考虑一个名为 "arr" 的 *5 x 5* 矩阵的第一行,呈蛇形排列:

    1 10 11 20 21

    奇数列中的元素等于 ((当前列 + 1) * 总列数);

    例如:arr[0][1] = (1 + 1) * 5 = 10


----------

    偶数列中的元素等于 (当前列 * 总列数) + 1;

    例如:arra[0][2] = (2 * 5) + 1 = 11;


**重要说明:** 第一行第一列的元素为零

     arr[0][0] = 1    -> 必须声明


现在,剩下的矩阵是从该列的第一个元素开始的递增或递减循环。

    偶数列号的元素在每一行从该列的第一个元素开始递增1。

     1  -> 第0列的第一个元素
     2  -> (1 + 1)
     3  -> (2 + 1).... 以此类推
     4 
     5


----------

    奇数列号的元素在每一行从该列的第一个元素开始递减1。

     10  -> 第1列的第一个元素
     9   -> (10 - 1)
     8   -> (9 - 1).... 以此类推
     7      
     6
英文:

I believe this is a good alternative and easy to understand. Do comment if you have a simplified version of the same.

Code:

import java.util.Arrays;
import java.util.Scanner;
public class SnakePatternProblem {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);   // *INPUT*
int row = scanner.nextInt();
int col = scanner.nextInt();
int[][] array = new int[row][col];
// Initializing first row of the array with a generalized expression
for (int i = 0; i &lt; col; i++) {
if (i % 2 != 0) array[0][i] = col * (i+1); 
else array[0][i] = (col * i) + 1;
}
array[0][0] = 1; // this element is not covered in the above loop.
// Nested loop for incrementing and decrementing as per the first row of elements.
for (int i= 1; i&lt; row; i++){
for (int j=0; j&lt; col; j++){
if(j%2==0) array[i][j] = array[i-1][j] + 1;
else array[i][j] = array[i-1][j] - 1;
}
}
System.out.println(Arrays.deepToString(array));    // *OUTPUT  
}
}

Explanation:

Consider first row of 5 x 5 matrix named "arr" with snake pattern:

1 10 11 20 21
The element in the odd column is equivalent to ((currentColumn + 1) * Total_No_Of_columns);
Example: arr[0][1] = (1 + 1)* 5 = 10

The element in the even column is equivalent to (currentColumn * Total_No_Of_columns) + 1;
Example: arra[0][2] = (2 * 5) + 1 = 11;

Important Note: element at first row, first column is Zero

 arr[0][0] = 1    -&gt; must be declared

Now, the remaining matrix is incrementing or decrementing loop from the first element in that column.

Elements with even column number gets incremented by 1 in each row from the first element of that column.
1  -&gt; First element of column-0
2  -&gt; (1 + 1)
3  -&gt; (2 + 1).... so on
4 
5

Elements with odd column number gets decremented by 1 in each row from the first element of that column. 
10  -&gt; First element of column - 1
9   -&gt; (10 - 1)
8   -&gt; (9 - 1).... so on  
7      
6    

答案2

得分: 0

这将生成你所描述的“蛇形”模式。

虽然可以使用三元运算符简化,但我认为这样更易读。

不过,如果有人找到更好的方法,可以在评论中分享一下。

public static int[][] genArray(int length) {
    int[][] arr = new int[length][length];

    int counter = 0;
    for (int col = 0; col < arr.length; col++) {
        if (col % 2 == 0) {
            for (int row = 0; row < arr.length; row++) {
                arr[row][col] = counter++;
            }
        } else {
            for (int row = arr.length - 1; row >= 0; row--) {
                System.out.println("row: " + row + ", col: " + col);
                arr[row][col] = counter++;
            }
        }
    }
    return arr;
}
英文:

This will generate the "snaking" pattern you described.

It could be simplified with ternary but this makes it more readable I think

It would be interesting to find a more clever way about it though, if anyone finds a better way pls comment

public static int[][] genArray(int length) {
int[][] arr = new int[length][length];
int counter = 0;
for (int col = 0; col &lt; arr.length; col++) {
if (col % 2 == 0) {
for (int row = 0; row &lt; arr.length; row++) {
arr[row][col] = counter++;
}
} else {
for (int row = arr.length - 1; row &gt;= 0; row--) {
System.out.println(&quot;row: &quot; + row + &quot;, col: &quot; + col);
arr[row][col] = counter++;
}
}
}
}
return arr;
}

答案3

得分: 0

int m = 5;
int n = 4;
int[][] snakeArr = IntStream.range(0, n)
        .mapToObj(i -> IntStream.range(0, m)
                // even row - straight order,
                // odd row - reverse order
                .map(j -> (i % 2 == 0 ? j : m - j - 1) + i * m + 1)
                .toArray())
        .toArray(int[][]::new);

// output
Arrays.stream(snakeArr)
        .map(row -> Arrays.stream(row)
                .mapToObj(e -> String.format("%2d", e))
                .collect(Collectors.joining(" ")))
        .forEach(System.out::println);
 1  2  3  4  5
10  9  8  7  6
11 12 13 14 15
20 19 18 17 16

Transposing snake array:

int[][] transposedSA = new int[m][n];
IntStream.range(0, m).forEach(i ->
        IntStream.range(0, n).forEach(j ->
                transposedSA[i][j] = snakeArr[j][i]));

// output
Arrays.stream(transposedSA)
.map(row -> Arrays.stream(row)
.mapToObj(e -> String.format("%2d", e))
.collect(Collectors.joining(" ")))
.forEach(System.out::println);


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


<details>
<summary>英文:</summary>
You can create such an array as follows:
```java
int m = 5;
int n = 4;
int[][] snakeArr = IntStream.range(0, n)
.mapToObj(i -&gt; IntStream.range(0, m)
// even row - straight order,
// odd row - reverse order
.map(j -&gt; (i % 2 == 0 ? j : m - j - 1) + i * m + 1)
.toArray())
.toArray(int[][]::new);
// output
Arrays.stream(snakeArr)
        .map(row -&gt; Arrays.stream(row)
                .mapToObj(e -&gt; String.format(&quot;%2d&quot;, e))
                .collect(Collectors.joining(&quot; &quot;)))
        .forEach(System.out::println);
 1  2  3  4  5
10  9  8  7  6
11 12 13 14 15
20 19 18 17 16

Transposing snake array:

int[][] transposedSA = new int[m][n];
IntStream.range(0, m).forEach(i -&gt;
        IntStream.range(0, n).forEach(j -&gt;
                transposedSA[i][j] = snakeArr[j][i]));
// output
Arrays.stream(transposedSA)
        .map(row -&gt; Arrays.stream(row)
                .mapToObj(e -&gt; String.format(&quot;%2d&quot;, e))
                .collect(Collectors.joining(&quot; &quot;)))
        .forEach(System.out::println);
 1 10 11 20
2  9 12 19
3  8 13 18
4  7 14 17
5  6 15 16

答案4

得分: 0

以下是翻译好的内容:

一种简单的方法是创建一个如下所示的二维数组,然后打印其转置。

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

这是一个维度为 LEN x LEN 的二维数组,其中 LEN = 5

上述模式如下:

  1. 模式以 start 值为 1 开始。
  2. 当主循环计数器为偶数时,将分配值给数组的计数器从 start 值开始,逐次增加 LEN 次。最后,它将设置下一行的 startfinal_value_of_the_array_value_assignment_counter - 1 + LEN 开始。
  3. 当主循环计数器为奇数时,将分配值给数组的计数器从 start 值开始,逐次减少 LEN 次。最后,它将设置下一行的 startstart + 1 开始。

上述矩阵的转置如下:

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

代码方面,我们可以写成:

public class Main {
    public static void main(String[] args) {
        final int LEN = 5;
        int[][] arr = new int[LEN][LEN];
        int start = 1, j, k, col;
        for (int i = 0; i < LEN; i++) {
            if (i % 2 == 0) {
                k = 1;
                for (j = start, col = 0; k <= LEN; j++, k++, col++) {
                    arr[i][col] = j;
                }
                start = j - 1 + LEN;
            } else {
                k = 1;
                for (j = start, col = 0; k <= LEN; j--, k++, col++) {
                    arr[i][col] = j;
                }
                start++;
            }
        }

        // 打印矩阵的转置
        for (int r = 0; r < LEN; r++) {
            for (int c = 0; c < LEN; c++) {
                System.out.print(arr[c][r] + "\t");
            }
            System.out.println();
        }
    }
}

输出:

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

LEN 的值更改为 10,您将得到以下模式:

1   20  21  40  41  60  61  80  81  100 
2   19  22  39  42  59  62  79  82  99  
3   18  23  38  43  58  63  78  83  98  
4   17  24  37  44  57  64  77  84  97  
5   16  25  36  45  56  65  76  85  96  
6   15  26  35  46  55  66  75  86  95  
7   14  27  34  47  54  67  74  87  94  
8   13  28  33  48  53  68  73  88  93  
9   12  29  32  49  52  69  72  89  92  
10  11  30  31  50  51  70  71  90  91
英文:

An easy way to do it is to create a 2-D array as shown below and then print its transpose.

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

It is a 2-D array of the dimension, LEN x LEN, where LEN = 5.

The above pattern goes like this:

  1. The pattern starts with a start value of 1.
  2. When the main loop counter is an even number, the counter, which assigns a value to the array, starts with start value and increases by one, LEN times. Finally, it sets start for the next row to start with final_value_of_the_array_value_assignment_counter - 1 + LEN.
  3. When the main loop counter is an odd number, the counter, which assigns a value to the array, starts with start value and decreases by one LEN times. Finally, it sets start for the next row to start with start + 1.

The transpose of the above matrix will look like:

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

In terms of code, we can write it as:

public class Main {
public static void main(String[] args) {
final int LEN = 5;
int[][] arr = new int[LEN][LEN];
int start = 1, j, k, col;
for (int i = 0; i &lt; LEN; i++) {
if (i % 2 == 0) {
k = 1;
for (j = start, col = 0; k &lt;= LEN; j++, k++, col++) {
arr[i][col] = j;
}
start = j - 1 + LEN;
} else {
k = 1;
for (j = start, col = 0; k &lt;= LEN; j--, k++, col++) {
arr[i][col] = j;
}
start++;
}
}
// Print the transpose of the matrix
for (int r = 0; r &lt; LEN; r++) {
for (int c = 0; c &lt; LEN; c++) {
System.out.print(arr[c][r] + &quot;\t&quot;);
}
System.out.println();
}
}
}

Output:

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

Change the value of LEN to 10 and you will get the following pattern:

1	20	21	40	41	60	61	80	81	100	
2	19	22	39	42	59	62	79	82	99	
3	18	23	38	43	58	63	78	83	98	
4	17	24	37	44	57	64	77	84	97	
5	16	25	36	45	56	65	76	85	96	
6	15	26	35	46	55	66	75	86	95	
7	14	27	34	47	54	67	74	87	94	
8	13	28	33	48	53	68	73	88	93	
9	12	29	32	49	52	69	72	89	92	
10	11	30	31	50	51	70	71	90	91	

huangapple
  • 本文由 发表于 2020年4月11日 09:02:42
  • 转载请务必保留本文链接:https://go.coder-hub.com/61150845.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定