我对编程很陌生,我有这个任务来解决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[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);
}
堆栈类,有push,pop,size,get函数(返回int,push函数的参数是int)
我只需要使用回溯和堆栈来解决它,不需要递归。
编辑:顺便说一句,如果我改变了
if(s.size() == size)
printBoard(column, size);
将尺寸变量替换为1,我得到了印刷板,否则我什么也得不到。
编辑: 问题在于推送和弹出,算法不太正确,因为我最终只得到堆栈中的1个元素。
答案 0 :(得分:2)
为了澄清任何感兴趣的人,“N皇后”问题让人联想到“8皇后”问题,其中必须在国际象棋棋盘上放置8个皇后,这样任何一个皇后都无法捕获另一个皇后。这可以扩展到任意数量的皇后(只要棋盘具有适当的尺寸)。这个谜题非常适合递归,通常在递归章节中讲授。这是谜题的link。
您说您可以使用stack
而不是recursion
。递归实际上是通过使用堆栈(您从未明确地与之交互)来实现的。这意味着可以通过使用堆栈来编写任何递归函数。在这种情况下,堆栈用于跟踪功能参数和其他相关变量。更具体地说,当调用新的递归函数时,函数中的所有当前本地数据都被压入堆栈。退出递归调用后需要检索数据时,会弹出堆栈顶部的数据,然后再次使用。
您可能更容易首先编写递归函数来解决问题,然后弄清楚如何将递归解决方案“转换”为具有堆栈的迭代解决方案。尝试迭代地编写解决方案,然后确定需要跟踪哪些信息以便回溯工作也是一个好主意。我注意到你也使用一维数组来存储皇后的位置,但是通过首先使用二维数组更好地可视化拼图可能是有用的。这也使您的编程更加直接。
答案 1 :(得分:0)
我不熟悉N皇后问题,正如评论者提到的那样,我不确定你面临的问题是什么,但这里有两个快速观察:
在你的isSafe()方法中初始化一个新堆栈(因此将为空)然后你立即在if条件中执行检查以确定其内容 - 所以这个方法总是返回true - 你的意思是将你在main方法中创建的堆栈传递给这个?
非常小的观察,但是当执行对布尔语的if语句时你不需要“== false” - if(!isSafe(column,size))就足够了(注意我添加了!for for false)< / p>