多class数组修改

Multi class array modification

三天3道题(我希望我能一个人解决问题)今天还是关于我的数独项目。我正致力于在 Java 中构建一个数独游戏,并与其他编写了项目各个部分的人一起工作,现在我们正在尝试将数独求解器 class 与 JFrame class 这一切都很漂亮(或者它会在某一时刻)但现在我对我的 2D 数组的工作方式有疑问(更像是不是)。下面是我调用求解器并将其提供给许多方法来执行操作的代码:

public class FenetreGrille extends JFrame implements ActionListener{

public static int [][] NOMBRES_DEBUT;
public static int [][] GRILLE_MODIF = new int[9][9];
public int [][] GRILLE_FINALE = new int[9][9];

public static final int TAILLE = 9;                                 
public static int TAILLECASE = 60;
public static int COTEGRILLE ;

public FenetreGrille(int [][] t){
    NOMBRES_DEBUT = t;
    GRILLE_MODIF = NOMBRES_DEBUT;
    GRILLE_FINALE = NOMBRES_DEBUT;
    COTEGRILLE = TAILLE * TAILLECASE;

    SudokuBackTrack sbt = new SudokuBackTrack(GRILLE_FINALE);
    // Here is the problem ^^^^^
    // More code below that shouldn't be important...
}

这里是 SudokuBackTrack class:

public class SudokuBackTrack{

public static int[][] grille;
public static int[][] grilleResolu;
public static int[][] grillePos;

public static boolean[][] existeSurLigne = new boolean[9][9];
public static boolean[][] existeSurColonne = new boolean[9][9];
public static boolean[][] existeSurBloc = new boolean[9][9];

public final static int taille = 9;

public static ArrayList<Case> valParCase;

public SudokuBackTrack(int[][] t) {
    grille = t;
    grilleResolu = grille;
    valParCase = listeValPossibles(grilleResolu);
    tableauxExistence(grilleResolu);
    backtracking(0, grilleResolu);
}

public static ArrayList<Case> listeValPossibles(int[][] temp) {
    ArrayList<Case> t = new ArrayList<Case>();

    for (int i=0; i<9; i++){
        for (int j=0; j<9; j++){
            if(temp[i][j] == 0) {
                int pos = i*taille+j;
                t.add(valeursPossibles(pos, temp));
            }
        }
    }
    Collections.sort(t);
    return t;
}

public static Case valeursPossibles(int pos, int[][] t) {
    int i = pos/9;
    int j = pos%9;
    int valPossibles = 9;

    for(int s=1; s<=9; s++) {
        if(!absentSurLigne(s, i, t) || !absentSurColonne(s, j, t) || !absentDansBloc(s, i, j, t)) {
            valPossibles--;
        }
    }
    Case a = new Case(pos, valPossibles);
    return a;
}

public static boolean absentSurLigne(int k, int i, int[][] t) {
    for (int j=0; j < 9; j++) {
        if (t[i][j] == k) {
            return false;
        }
    }
    return true;
}

public static boolean absentSurColonne(int k, int j, int[][] t) {
    for (int i=0; i < 9; i++) {
        if (t[i][j] == k) {
            return false;
        }
    }
    return true;
}

public static boolean absentDansBloc(int k, int i, int j, int[][] t) {
    int _i = i-(i%3);   // ou encore : _i = 3*(i/3);
    int _j = j-(j%3);   // ou encore : _j = 3*(j/3);
    for (i=_i; i < _i+3; i++) {
        for (j=_j; j < _j+3; j++) {
            if (t[i][j] == k) {
                return false;
            }
        }
    }
    return true;
}

public static void tableauxExistence(int[][] t) {
    for (int i=0; i < 9; i++) {
        for (int j=0; j < 9; j++) {
            existeSurLigne[i][j] = existeSurColonne[i][j] = existeSurBloc[i][j] = false;
        }
    }

    int k;
    for (int i=0; i < 9; i++) {
        for (int j=0; j < 9; j++) {
            if ((k = t[i][j]) != 0) {
                existeSurLigne[i][k-1] = existeSurColonne[j][k-1] = existeSurBloc[3*(i/3)+(j/3)][k-1] = true;
            }
        }
    }
}

public static boolean backtracking(int index, int[][] t) {

    if(index == valParCase.size()) {
        return true;
    }

    int i = (valParCase.get(index).position)/9;
    int j = (valParCase.get(index).position)%9;

    for(int k = 0; k < 9; k++) {
        if(!existeSurLigne[i][k] && !existeSurColonne[j][k] && !existeSurBloc[3*(i/3)+(j/3)][k]){
            // Ajoute k aux valeurs enregistrées
            existeSurLigne[i][k] = existeSurColonne[j][k] = existeSurBloc[3*(i/3)+(j/3)][k] = true;

            if(backtracking(index+1, t)){
                // Ecrit le choix valide dans la grille
                t[i][j] = k+1;
                return true;
            }
            // Supprime k des valeurs enregistrées
            existeSurLigne[i][k] = existeSurColonne[j][k] = existeSurBloc[3*(i/3)+(j/3)][k] = false;
        }
    }

    t[i][j] = 0;
    return false;
}

如上所述,我的问题是当我使用 2D 数组 GRILLE_FINALE 创建 SudokuBackTrack class 的实例时,我所有的 2D 数组 NOMBRES_DEBUT、GRILLE_MODIF 和 GRILLE_FINALE 成为已解决的数独网格,而我想要的只是 GRILLE_FINALE 成为已解决的版本,而不是全部 3。我已经尝试调试代码,但我没有找到任何东西,因为它是来自不同人的代码的混合,我不知道他们每个人是如何创建他们的部分的。我已经修改了属性类型并尝试了各种花哨的东西,但都没有用,我没有想法,主要是时间...提前致谢,对于这个巨大的问题和代码,我们深表歉意。

您正在将二维数组的相同实例放入 NOMBRES_DEBUT、GRILLE_MODIF、GRILLE_FINALE。我认为您要做的是将 copy NOMBRES_DEBUT 放入 GRILLE_MODIF 和 GRILLE_FINALE 中。

按照您现在设置的方式,无论您何时修改 3 个数组中的任何一个,最终都会修改所有 3 个数组,因为所有 3 个数组都指向内存中的同一个数组。