Я пытаюсь решить знаменитую проблему n-ферзей.И я пытаюсь вести учет всех возможных решений для платы размером NxN.
Для этого используется ArrayList для хранения каждого найденного решения платы.Я мог бы проверить, что код находит решения и сохраняет их в списке массивов.Однако при проверке окончательного списка массивов он просто содержит матрицу символов в том виде, в каком она была инициализирована.
Может кто-нибудь взглянуть и помочь мне выяснить, какого чёрта Java неправильно хранит матрицу символов?
Спасибо!код ниже:
public static ArrayList<char[][]> nQueens(int n)
{
char board[][] = new char[n][n];
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
board[i][j] = '-';
ArrayList<char[][]> solution = new ArrayList<char[][]>();
nQueensHelper(board, 0, n, solution);
return solution;
}
public static void nQueensHelper(char [][] board, int row, int N, ArrayList<char[][]> solution)
{
printBoard(board, N);
System.out.println();
if(row == N)
{
System.out.println("solution");
printBoard(board, N);
System.out.println("**\n");
solution.add(board);
return;
}
for(int col = 0; col < N; col++)
{
if(checker(board, row, col, N))
{
board[row][col] = 'q';
nQueensHelper(board, row+1, N, solution);
board[row][col] = '-';
}
}
}
public static boolean checker(char [][] board, int row, int col, int N)
{
//check diagonal - upper-left to bottom-right
for(int i = row, j = col; i >= 0 && j >= 0; i--,j--)
if(board[i][j] == 'q')
return false;
//check column
for(int i = row; i >= 0; i--)
if(board[i][col] == 'q')
return false;
//check diagonal - upper-right to bottom-left
for(int i = row, j = col; i >= 0 && j < N; i--,j++)
if(board[i][j] == 'q')
return false;
return true;
}
public static void printBoard(char board[][], int n)
{
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++)
{
System.out.print(board[i][j]);
}
System.out.println();
}
}
// основной тест
public static void main(String [] args) throws FileNotFoundException, IOException, ParseException, ScriptException
{
ArrayList<char[][]> solution = nQueens(4);
System.out.println(solution);
}