堆栈被覆盖
Stack got overwrite
我正在编写一个创建节点树的程序,并在 dfs 上找到它(尚未完成),但是当我尝试将新节点推送到 class 时遇到问题。新节点用我的方法覆盖旧节点。节点 class 像这样声明
public class Node {
int[][] matrix;
Node pre;
boolean visited;
}
和class像这样的dfs:(短缺,只有代码有bug)
import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;
public class DFS {
private static Stack<Node> stack;
public DFS()
{
stack = new Stack<Node>();
}
public static int dfs(int matrix[][])
{
Node first = new Node();
first.matrix= matrix;
first.visited=true;
first.pre= null;
stack.push(first);
pushleft(stack.peek());
pushleft(stack.peek());
return 0;
}
public static void pushleft(Node Nodeleft)
{
Node Newnode= new Node();
Newnode.matrix = left(Nodeleft.matrix);
stack.push(Newnode);
}
public static int[][] left (int matrix[][]) {
int matrix1[][]= new int[4][4];
for(int i=0; i<=3;i++)
for (int j=3;j>=0;j--)
{
if (matrix[i][j] !=0)
{
for (int k=j; k>=0; k--)
if (matrix[i][k]==0)
{
for (int l=k; l<=2;l++)
matrix1[i][l]=matrix[i][l+1];
matrix1[i][3]=0;
}
break;
}
}
for(int i=0; i<=3;i++)
for (int j=0;j<=2;j++)
{
if (matrix[i][j]==matrix[i][j+1])
{
matrix1[i][j]=matrix[i][j]*2;
for (int l=j+1; l<=2;l++)
matrix1[i][l]=matrix[i][l+1];
matrix1[i][3]=0;
}
}
return matrix1;
}
public static void main(String[] args)
{
stack = new Stack<Node>();
int a[][]=new int[4][4];
int goal;
Scanner in = new Scanner(System.in);
System.out.println("input 4x4");
for(int i=0; i<=3;i++)
for (int j=0;j<=3;j++)
{
a[i][j]=in.nextInt();
}
if (dfs(a)==0)
{
System.out.println("Win");
System.out.println("Cac trang thai:");
while (!stack.isEmpty())
{
for(int i=0; i<=3;i++)
{
for (int j=0;j<=3;j++)
{
System.out.print(stack.peek().matrix[i][j]+ " ");
}
System.out.println("");
}
System.out.println("");
stack.pop();
}
in.close();
}
}
}
当我尝试放入这个数组时
0 0 0 0
2 2 2 2
0 0 0 2
2 2 4 4
I want my output like this:<br/>
0 0 0 0
8 0 0 0
2 0 0 0
4 8 0 0
0 0 0 0
4 4 0 0
2 0 0 0
4 8 0 0
0 0 0 0
2 2 2 2
0 0 0 2
2 2 4 4
但它只打印了 3 次:
0 0 0 0
8 0 0 0
2 0 0 0
4 8 0 0
我想我的方法 pushleft 遇到了静态或类似问题,但仍然无法修复。有人可以帮忙吗?
您需要在调用 pushleft
时每次创建新的 Matrix
。
您遇到问题是因为所有 Matrix Arrays
都指向同一个 object
。
因此,如果您更改一个 matrix
中的任何内容,它也会更改其他 Node object
的所有 matrix
。
创建新的 Matrix
数组并从 old matrix array
.
中赋值
作为
public static int[][] left (int matrix[][]) {
int matrix2[][] = new int[4][4];
// assign all the values as you want
// your code...
return matrix2;
}
我正在编写一个创建节点树的程序,并在 dfs 上找到它(尚未完成),但是当我尝试将新节点推送到 class 时遇到问题。新节点用我的方法覆盖旧节点。节点 class 像这样声明
public class Node {
int[][] matrix;
Node pre;
boolean visited;
}
和class像这样的dfs:(短缺,只有代码有bug)
import java.util.Arrays;
import java.util.Scanner;
import java.util.Stack;
public class DFS {
private static Stack<Node> stack;
public DFS()
{
stack = new Stack<Node>();
}
public static int dfs(int matrix[][])
{
Node first = new Node();
first.matrix= matrix;
first.visited=true;
first.pre= null;
stack.push(first);
pushleft(stack.peek());
pushleft(stack.peek());
return 0;
}
public static void pushleft(Node Nodeleft)
{
Node Newnode= new Node();
Newnode.matrix = left(Nodeleft.matrix);
stack.push(Newnode);
}
public static int[][] left (int matrix[][]) {
int matrix1[][]= new int[4][4];
for(int i=0; i<=3;i++)
for (int j=3;j>=0;j--)
{
if (matrix[i][j] !=0)
{
for (int k=j; k>=0; k--)
if (matrix[i][k]==0)
{
for (int l=k; l<=2;l++)
matrix1[i][l]=matrix[i][l+1];
matrix1[i][3]=0;
}
break;
}
}
for(int i=0; i<=3;i++)
for (int j=0;j<=2;j++)
{
if (matrix[i][j]==matrix[i][j+1])
{
matrix1[i][j]=matrix[i][j]*2;
for (int l=j+1; l<=2;l++)
matrix1[i][l]=matrix[i][l+1];
matrix1[i][3]=0;
}
}
return matrix1;
}
public static void main(String[] args)
{
stack = new Stack<Node>();
int a[][]=new int[4][4];
int goal;
Scanner in = new Scanner(System.in);
System.out.println("input 4x4");
for(int i=0; i<=3;i++)
for (int j=0;j<=3;j++)
{
a[i][j]=in.nextInt();
}
if (dfs(a)==0)
{
System.out.println("Win");
System.out.println("Cac trang thai:");
while (!stack.isEmpty())
{
for(int i=0; i<=3;i++)
{
for (int j=0;j<=3;j++)
{
System.out.print(stack.peek().matrix[i][j]+ " ");
}
System.out.println("");
}
System.out.println("");
stack.pop();
}
in.close();
}
}
}
当我尝试放入这个数组时
0 0 0 0
2 2 2 2
0 0 0 2
2 2 4 4
I want my output like this:<br/>
0 0 0 0
8 0 0 0
2 0 0 0
4 8 0 0
0 0 0 0
4 4 0 0
2 0 0 0
4 8 0 0
0 0 0 0
2 2 2 2
0 0 0 2
2 2 4 4
但它只打印了 3 次:
0 0 0 0
8 0 0 0
2 0 0 0
4 8 0 0
我想我的方法 pushleft 遇到了静态或类似问题,但仍然无法修复。有人可以帮忙吗?
您需要在调用 pushleft
时每次创建新的 Matrix
。
您遇到问题是因为所有 Matrix Arrays
都指向同一个 object
。
因此,如果您更改一个 matrix
中的任何内容,它也会更改其他 Node object
的所有 matrix
。
创建新的 Matrix
数组并从 old matrix array
.
作为
public static int[][] left (int matrix[][]) {
int matrix2[][] = new int[4][4];
// assign all the values as you want
// your code...
return matrix2;
}