使用堆栈在java中进行Queen练习
我是编程新手,我的任务是解决N皇后问题。 我不知道我的代码出了什么问题,我花了很多时间。 有人能帮我找到正确的方向吗使用堆栈在java中进行Queen练习,java,algorithm,Java,Algorithm,我是编程新手,我的任务是解决N皇后问题。 我不知道我的代码出了什么问题,我花了很多时间。 有人能帮我找到正确的方向吗 public static boolean isSafe(int[] col, int size, stack s) { int x; for(int i = 1; i<=size; i++) { if(s.get(i)==i || ((s.get(i-1) - s.get(i)) == (col[i-1] - col
public static boolean isSafe(int[] col, int size, stack s)
{
int x;
for(int i = 1; i<=size; i++)
{
if(s.get(i)==i || ((s.get(i-1) - s.get(i)) == (col[i-1] - col[i])))
return false;
}
return true;
}
public static void solve(int size, stack s)
{
int[] column = new int[size];
int x = 0;
s.push(0);
column[0] = 0;
for(int i = 0; i<size; i++)
{
for(int j = 0; j<size;j++)
{
if(isSafe(column,size) == true)
{
s.push(i);
column[i] = j;
}
else
{
x = s.pop();
if(x+1<size)
{
column[i] = x+1;
s.push(x+1);
}
else
{
j=0;
column[i] = j;
s.push(i+1);
}
}
}
}
if(s.size() == size)
printBoard(column, size);
}
将大小变量替换为1,我将打印电路板,否则我将一无所获
编辑:
问题在于推送和弹出,算法不太正确,因为堆栈中只有一个元素。我不熟悉N Queens问题,正如评论员提到的,我不确定您面临的问题是什么,但这里有两个快速观察:
为了向任何感兴趣的人澄清,“N皇后”问题让人想起“8皇后”问题,即必须将8个皇后放在一个棋盘上,这样就没有一个皇后可以捕获另一个皇后。这可以扩展到任意数量的皇后(只要棋盘具有适当的尺寸)。这个谜题很适合递归,经常在递归章节中教授。这是谜题的答案 您说您可以使用
堆栈
,但不能使用递归
。递归实际上是通过使用堆栈(您从未显式地与之交互)来工作的。这意味着可以通过使用堆栈来编写任何递归函数。在这种情况下,堆栈用于跟踪函数参数和其他相关变量。更具体地说,当调用一个新的递归函数时,函数中的所有当前本地数据都被推送到堆栈上。当退出递归调用后需要检索数据时,会弹出堆栈顶部的数据,然后再次使用
首先编写一个递归函数来解决问题,然后找出如何将递归解决方案“转换”为具有堆栈的迭代解决方案,可能会更容易。尝试迭代地编写解决方案,然后找出回溯工作需要跟踪哪些信息也是一个好主意。我注意到你也在使用一维数组来存储皇后的位置,但是首先使用二维数组来更好地可视化这个谜题可能会有用。这也使您的编程更加简单。请更具体一点。什么是不起作用的?你有错误吗?还是你只是得到了错误的答案?@SimonAndréForsberg我的代码有问题,我没有得到错误。但是当我调用print函数来打印电路板时,我什么也看不到。您的逻辑似乎倾向于检查isSafe(column,size)==true,但测试的是false。@phatfingers我刚刚将其更改为true,同样的问题。希望现在这是一个不同的问题,是吗?如果我理解正确,您希望您的程序将size=N皇后放置在棋盘上,这样它们就不会相互攻击。从size=1开始,首先让它工作。我想你会发现我应该是基于零的,而不是在你的初始循环中基于一个。还是有同样的问题,我同意。我实际上需要以迭代方式而不是递归方式使用。我将使用2D阵列,我认为这是最好的方法。1D数组只存储列,我实际上是在堆栈中存储行。我想改变我自己的堆栈实现,以返回一个包含行和列的数组。1D数组非常有效,但实现起来可能很“棘手”。另外,您不应该在堆栈中存储数组。最好每次(行和列)将两个值推送到堆栈上并弹出:
stk.push(行);stk.push(col)
然后检索:col=stk.pop();row=stk.pop()
mmm,这样更好。我会照你说的做。我只是对解算和检查函数的算法不感兴趣。你检查过了吗?我仍然怀疑…我不明白你的问题。“yeat”是什么?您尚未提供使用2D数组的实现。您需要重写每个函数以适应更改。啊,对不起,我打字有点快。我的意思是,“我只是还不确定上面发布的算法”没有任何改变,我只想知道我在当前代码中犯了什么错误。不管怎样,谢谢你的回复,我现在就做。
if(s.size() == size)
printBoard(column, size);