皇后在使用堆栈的java中锻炼

时间:2012-04-03 18:48:07

标签: 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[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个元素。

2 个答案:

答案 0 :(得分:2)

为了澄清任何感兴趣的人,“N皇后”问题让人联想到“8皇后”问题,其中必须在国际象棋棋盘上放置8个皇后,这样任何一个皇后都无法捕获另一个皇后。这可以扩展到任意数量的皇后(只要棋盘具有适当的尺寸)。这个谜题非常适合递归,通常在递归章节中讲授。这是谜题的link

您说您可以使用stack而不是recursion。递归实际上是通过使用堆栈(您从未明确地与之交互)来实现的。这意味着可以通过使用堆栈来编写任何递归函数。在这种情况下,堆栈用于跟踪功能参数和其他相关变量。更具体地说,当调用新的递归函数时,函数中的所有当前本地数据都被压入堆栈。退出递归调用后需要检索数据时,会弹出堆栈顶部的数据,然后再次使用。

您可能更容易首先编写递归函数来解决问题,然后弄清楚如何将递归解决方案“转换”为具有堆栈的迭代解决方案。尝试迭代地编写解决方案,然后确定需要跟踪哪些信息以便回溯工作也是一个好主意。我注意到你也使用一维数组来存储皇后的位置,但是通过首先使用二维数组更好地可视化拼图可能是有用的。这也使您的编程更加直接。

答案 1 :(得分:0)

我不熟悉N皇后问题,正如评论者提到的那样,我不确定你面临的问题是什么,但这里有两个快速观察:

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

  2. 非常小的观察,但是当执行对布尔语的if语句时你不需要“== false” - if(!isSafe(column,size))就足够了(注意我添加了!for for false)< / p>