有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java堆栈被覆盖了

我正在编写一个程序,它可以生成一个节点树,并在dfs上找到它(尚未完成),但当我试图将一个新节点推送到类中时,遇到了一个问题。新节点用我的方法覆盖旧节点。节点类这样声明

public class Node {
    int[][] matrix;
    Node pre;
    boolean visited;
}

像这样的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遇到了静态或类似的问题,但仍然无法修复。有人能帮忙吗


共 (1) 个答案

  1. # 1 楼答案

    您需要在每次调用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;
       }