使用堆栈在java中进行Queen练习

使用堆栈在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

我是编程新手,我的任务是解决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);
}
将大小变量替换为1,我将打印电路板,否则我将一无所获

编辑:
问题在于推送和弹出,算法不太正确,因为堆栈中只有一个元素。

我不熟悉N Queens问题,正如评论员提到的,我不确定您面临的问题是什么,但这里有两个快速观察:

  • 在isSafe()方法中,初始化一个新堆栈(因此将为空),然后立即在if条件中执行检查以确定其内容-因此此方法将始终返回true-您的意思是将在main方法中创建的堆栈传递给此方法吗

  • 非常小的观察,但是在布尔型上执行if语句时,您不需要“==false”-if(!isSafe(column,size))就足够了(注意,我添加了!用于检查false)


  • 为了向任何感兴趣的人澄清,“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);