所以我有这个基本的N Queen Program解算器。
它是为了在1个数组中提供所有可能的解决方案。换句话说,如果我得到一个值为{5,3,2,1,7,8,5,3}的数组,则意味着第一个索引表示该列的行和值。
我对这个程序的问题在于我试图“以图形方式”表示一个棋盘,上面有该阵列的解决方案。方法“printTable”应该按照我所解释的规则将该1D数组转换为2D数组。然后我尝试将该方法实现到QueenSolve方法中。这是令人讨厌的地方。
我已经尝试过printTable方法,它可以完全独立工作,但是当我使用QueenSolve方法时,它并没有给我预期的结果。
我一定是对数组做错了。如果您在下面编译此代码,您将看到8 Queens拼图的第一个解决方案很好,但是随着您的进展,您会看到一些皇后区开始相互重叠,最后它真的是凌乱。
我只是想知道我的问题是否有解决方案。我知道围绕结果数组必须存在一个问题。我试图通过将结果数组(也称为一个解决方案)与数组列表存储在一起然后从那里找到一个来找到处理它的一些方法,但是我会得到一些不同的结果。
如果有人可以浏览一下这个程序并进行编译。我会很感激任何帮助。 谢谢!
import java.util.Arrays;
import java.util.ArrayList;
public class NQueens {
static int[] result;
private int board[][]=new int[8][8];
private int N =8;
private int u=0;
public boolean QueenChecker(int x, int y) {
for (int i = 0; i < x; i++) {
if ((result[i] == y) || (Math.abs(i - x) == Math.abs(result[i] - y))) {
return false;
}
}
return true;
}
public void QueenSolve(int x) {
for (int i = 0; i < result.length; i++) {
if (QueenChecker(x, i)) {
result[x] = i; // place the queen at this position.
if (x == result.length - 1) {
printTable(result,N);
}
QueenSolve(x + 1);
}
}
}
public void printTable(int result[], int N)
{
for(int s=0;s<result.length;s++){
for (int u=0;u<result.length;u++)
{
board[s][result[s]]=1;
}
for(int j=0;j<result.length;j++){
if(board[s][j]==1)
System.out.print("Q");
else
System.out.print("*" );
}
System.out.println();//"\n");
}
}
public void AllSolutions(int j)
{
System.out.println("Solution : "+ j);
printTable(result,N);
System.out.println();
}
public static void main(String[] args) {
int n = 8;
result = new int[n];
NQueens i = new NQueens();
i.QueenSolve(0);
}
}
答案 0 :(得分:0)
你遇到的一个问题是你永远不会清理你的董事会。
解决问题的一个快速解决方法是确保在您的打印方法开始时获得一个新鲜的&#34;板。
public void printTable(int result[], int N)
{
// Clear the board.
board = new int[8][8];
for(int s=0;s<result.length;s++){
for (int u=0;u<result.length;u++)
{
board[s][result[s]]=1;
}
for(int j=0;j<result.length;j++){
if(board[s][j]==1)
System.out.print("Q");
else
System.out.print("*" );
}
System.out.println();//"\n");
}
// Line at the end to separate the different boards from one another.
System.out.println("---------------------");
}
这只是我发现的一个明显问题。可能会有更多 - 我没有彻底检查。我提供的解决方案不是最佳实践,而只是一个快速而肮脏的解决方案。一旦您按预期工作,我建议您前往https://codereview.stackexchange.com/询问如何改进代码。