英文:
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("Choose a number for the rows from 0 to 16.");
        //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("Choose a number for the columns from 0 to 16");
        //take the input from user with nextInt()
        //use the variable int col
        int col = inScan.nextInt();
        if (row != col) {
            System.out.println("Run the program again and choose the same number for Row and Col");
            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 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 < array[0].length; j++) {
            if (flag) {
                for (int i = 0; i < 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 > 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 < 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< 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));    // *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    -> 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  -> First element of column-0
2  -> (1 + 1)
3  -> (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  -> First element of column - 1
9   -> (10 - 1)
8   -> (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 < 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;
}
答案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 -> 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
答案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。
上述模式如下:
- 模式以 
start值为1开始。 - 当主循环计数器为偶数时,将分配值给数组的计数器从 
start值开始,逐次增加LEN次。最后,它将设置下一行的start以final_value_of_the_array_value_assignment_counter - 1 + LEN开始。 - 当主循环计数器为奇数时,将分配值给数组的计数器从 
start值开始,逐次减少LEN次。最后,它将设置下一行的start以start + 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:
- The pattern starts with a 
startvalue of1. - When the main loop counter is an even number, the counter, which assigns a value to the array, starts with 
startvalue and increases by one,LENtimes. Finally, it setsstartfor the next row to start withfinal_value_of_the_array_value_assignment_counter - 1 + LEN. - When the main loop counter is an odd number, the counter, which assigns a value to the array, starts with 
startvalue and decreases by oneLENtimes. Finally, it setsstartfor the next row to start withstart + 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 < 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++;
}
}
// Print the transpose of the matrix
for (int r = 0; r < LEN; r++) {
for (int c = 0; c < LEN; c++) {
System.out.print(arr[c][r] + "\t");
}
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	
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论