堆栈被覆盖

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;
   }