我试图用Java创建一个程序,该程序采用NxN矩阵并将其旋转到位。我正在实现一个采用每一列并将其更改为行的方法。我的堆栈是正确的,因此我的循环也是正确的,因为我已经将它们输出以进行检查。
Stack<Integer> takeCol = new Stack();
for (int i = 0; i < matrix.length; i++) {
//take columns and make them rows (ROTATION METHOD)
for (int j = matrix[i].length - 1; j >= 0; j--) {
takeCol.push(matrix[j][i]);
}
//reverse stack
Stack<Integer> temp = new Stack();
while (!takeCol.isEmpty()) {
temp.push(takeCol.pop());
}
//rotate matrix
for (int j = 0; j < matrix[i].length; j++) {
matrix[i][j] = temp.pop();
}
}
我的临时堆栈正确,放置的i和j也正确。但是,这是示例输出:
旋转前:
3 9 8 2
5 5 5 1
4 7 6 4
4 1 8 2
旋转后:
4 4 5 3
1 7 5 4
8 6 5 5
2 5 4 3
完整代码:
公共类Q1_7 {
public static void createMatrix(int matrix[][]) {
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
matrix[i][j] = (int)Math.round(Math.random() * 8) + 1;
}
}
}
public static void displayMatrix(int matrix[][]) {
System.out.println("\n\n");
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
System.out.println("\n\n");
}
public static void rotateMatrix(int matrix[][]) {
Stack<Integer> takeCol = new Stack();
for (int i = 0; i < matrix.length; i++) {
//take columns and make them rows (ROTATION METHOD)
for (int j = matrix[i].length - 1; j >= 0; j--) {
takeCol.push(matrix[j][i]);
}
//reverse stack
Stack<Integer> temp = new Stack();
while (!takeCol.isEmpty()) {
temp.push(takeCol.pop());
}
//rotate matrix
for (int j = 0; j < matrix[i].length; j++) {
matrix[i][j] = temp.pop();
}
}
displayMatrix(matrix);
}
public static void main(String args[]) {
Scanner s = new Scanner(System.in);
System.out.println("Enter size of matrix to be rotated");
int matrixSize = s.nextInt();
//create matrix size of user input
int matrix[][] = new int [matrixSize][matrixSize];
createMatrix(matrix);
displayMatrix(matrix);
rotateMatrix(matrix);
s.close();
}
}
答案 0 :(得分:1)
下面的回答很长-我已经在程序中添加了调试日志,以便更轻松地了解正在发生的事情。问题是,代码在旋转值之前会覆盖它们,例如。在读取之前,9被4覆盖。请参阅下面的代码和日志。 (还请注意,添加日志有助于调试)
输出为:
3 9 8 2
5 5 5 1
4 7 6 4
4 1 8 2
pushing num=[1] val=4
pushing num=[2] val=4
pushing num=[3] val=5
pushing num=[4] val=3
pushing temp num=[1] val=3
pushing temp num=[2] val=5
pushing temp num=[3] val=4
pushing temp num=[4] val=4
writing to m[0,0] val=4
writing to m[0,1] val=4 <-------- here: 9 is overridden by 4
writing to m[0,2] val=5
writing to m[0,3] val=3
pushing num=[5] val=1
pushing num=[6] val=7
pushing num=[7] val=5
pushing num=[8] val=4 <<----- here: we want 9 but is has been overridden
pushing temp num=[5] val=4
pushing temp num=[6] val=5
pushing temp num=[7] val=7
pushing temp num=[8] val=1
writing to m[1,0] val=1
writing to m[1,1] val=7
writing to m[1,2] val=5
writing to m[1,3] val=4
pushing num=[9] val=8
pushing num=[10] val=6
pushing num=[11] val=5
pushing num=[12] val=5
pushing temp num=[9] val=5
pushing temp num=[10] val=5
pushing temp num=[11] val=6
pushing temp num=[12] val=8
writing to m[2,0] val=8
writing to m[2,1] val=6
writing to m[2,2] val=5
writing to m[2,3] val=5
pushing num=[13] val=2
pushing num=[14] val=5
pushing num=[15] val=4
pushing num=[16] val=3
pushing temp num=[13] val=3
pushing temp num=[14] val=4
pushing temp num=[15] val=5
pushing temp num=[16] val=2
writing to m[3,0] val=2
writing to m[3,1] val=5
writing to m[3,2] val=4
writing to m[3,3] val=3
4 4 5 3
1 7 5 4
8 6 5 5
2 5 4 3
代码是:
package sample;
import java.util.Stack;
public class A {
void go(int[][] matrix) {
Stack<Integer> takeCol = new Stack<>();
int numPushTake=0;
int numPushTemp=0;
for (int i = 0; i < matrix.length; i++) {
//take columns and make them rows (ROTATION METHOD)
for (int j = matrix[i].length - 1; j >= 0; j--) {
int val = matrix[j][i];
System.out.printf("pushing num=[%d] val=%d%n", ++numPushTake, val);
takeCol.push(val);
}
//reverse stack
Stack<Integer> temp = new Stack();
while (!takeCol.isEmpty()) {
int val = takeCol.pop();
System.out.printf("pushing temp num=[%d] val=%d%n", ++numPushTemp, val);
temp.push(val);
}
//rotate matrix
for (int j = 0; j < matrix[i].length; j++) {
int val = temp.pop();
System.out.printf("writing to m[%d,%d] val=%d%n", i, j, val);
matrix[i][j] = val;
}
}
}
void dump(int[][] m) {
for (int i=0;i<m.length;i++) {
for (int j=0;j<m[i].length;j++)
System.out.print(m[i][j]+" ");
System.out.println("");
}
}
public static void main(String[] args) {
A o = new A();
int[][] matrix = {
{3, 9, 8, 2 },
{5, 5, 5, 1 },
{4, 7, 6, 4 },
{4, 1, 8, 2 }
};
o.dump(matrix);
System.out.println("\n");
o.go(matrix);
o.dump(matrix);
}
}
答案 1 :(得分:0)
Stack
是一个有趣的选择(挑战?)。请注意,您只需使用2D数组就可以就地执行此操作,而无需任何其他数据结构。
还请注意,您也可以从转置和y反射图元构成右旋转。
int[][] matrix = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11},
{12, 13, 14, 15}
};
// ignoring validation steps ...
// this is the transpose operation
int n = matrix.length;
for (int i = 0; i < n; i++) {
for (int j = 0; j < i; j++) {
int t = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = t;
}
}
// this is reflection on y-axis.
for (int i = 0; i < n; i++) {
for (int j = 0; j < n / 2; j++) {
int t = matrix[i][j];
matrix[i][j] = matrix[i][n - j - 1];
matrix[i][n - j - 1] = t;
}
}
for (int[] row : matrix) {
System.out.println(Arrays.toString(row));
}
会给予
[12, 8, 4, 0]
[13, 9, 5, 1]
[14, 10, 6, 2]
[15, 11, 7, 3]
除了组成构建块外,还可以使用具有不同元素的确定性输入,如果出现问题,则有助于调试。
您可以将两个循环融合为一个循环,但是首先获得可行的实现非常有用。