2
  • 我正在使用我自己的堆栈实现。
  • 我不应该使用递归。

我的代码:

public static void solve(int bsize)
{
    stack queenLoc = new stack();

    int y=0;
    int count=0;
    boolean done = false;


    while(done == false && queenLoc.size() != bsize)    
    {
        queenLoc.push(count);

        if(!isSafe(bsize,queenLoc,count))
        {
            while(queenLoc.getTop() == bsize)
            {
                y = queenLoc.pop();
                count--;
            }
            if(queenLoc.top != null)
            {
                queenLoc.push(queenLoc.pop()+1);
                count++;        
            }
            else
            {
                queenLoc.push(y+1);
                count++;
            }
        }
        else if(queenLoc.size() == bsize)
        {
            done = true;
        }
        else
        {
            count++;
            queenLoc.push(count);
        }
    }

    queenLoc.showAll();

    if(queenLoc.size() == bsize)
        printBoard(bsize, queenLoc);
}

public static boolean isSafe(int bsize, stack s,int count)
{               
    for(int i = 1; i<s.size(); i++)
    {
            if(s.getTop() == s.get(i) || s.getTop()+count == s.get(i)+s.size() || s.getTop()-count == s.get(i)-s.size())
                return false;
    }

    return true;
}

我不确定到底发生了什么,我的位置不对,printBoard 功能只在第一行打印皇后。我实际上尝试了很多可能性,但我有点困惑。

谁能指出我正确的方向并告诉我代码中的问题在哪里。我正在使用堆栈来存储列和堆栈类中的“计数”变量以将我指向哪一行。

4

3 回答 3

1
package mynqueens;


public class MyNQueens {
public static int board[][] = new int[4][4];
public static int row,column;

    public MyNQueens(){


    }
    public static void main(String[] args) {

    check(0,0);
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            System.out.print(board[i][j] + "\t");
        }
        System.out.println();
    }

    }
    public static void check(int i, int j ){

        while(i<3){
            board[i][j] = 1;
            i++;
        }
        while(i!=0){
            board[i][j] = 1;

            i--;
        }
        while(j<3){
            board[i][j]=1;
            j++;
        }
        while(j!=0){
            board[i][j] = 1;
            j--;
        }
        while(j<3 || i<3){
            board[i][j] = 1;
            i++;
            j++;
        }
        while(j!=0 || i!=0){
            board[i][j] = 1;
            i--;
            j--;
        }
        while(i<3 || j!=0){
            board[i][j]=1;
            i++;
            j--;
        }
        while(i!=0 || j<3){
         board[i][j]=1;
         i--;
         j++;

        }


    }




}
于 2014-12-20T20:48:25.223 回答
0

在开始擦除内部 while 部分中的元素之前

while(queenLoc.getTop() == bsize)
{
    y = queenLoc.pop();
    count--;
}

QueenStack 中的元素数量将超过 bsize。

while(done == false && queenLoc.size() != bsize)QueenLoc 的大小等于 bsize 时,您将打印结果。

我要说的是,在bsize步骤之后,您总是在打印结果。

建议:您的代码应该具有不变的“queenLoc 表示没有两个皇后互相攻击的位置”。

于 2012-04-05T17:01:14.780 回答
0
import java.util.Scanner;

/**
 *
 * @author Manimekalai
 */
public class Queen {


    public static boolean isConsistent(int[] q, int n)
    {
        for (int i = 0; i < n; i++)
        {
            if (q[i] == q[n])             return false;   // same column
            if ((q[i] - q[n]) == (n - i)) return false;   // same major diagonal
            if ((q[n] - q[i]) == (n - i)) return false;   // same minor diagonal
        }
        return true;
    }


    public static void printQueens(int[] q)
    {
        int N = q.length;
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                if (q[i] == j) System.out.print("Q ");
                else           System.out.print("* ");
            }
            System.out.println();
        }
        System.out.println();
    }



    public static void enumerate(int N)
    {
        int[] a = new int[N];
        enumerate(a, 0);
    }

    public static void enumerate(int[] q, int n)
    {
        int N = q.length;
        if (n == N) printQueens(q);
        else
        {
            for (int i = 0; i < N; i++)
            {
                q[n] = i;
                if (isConsistent(q, n)) enumerate(q, n+1);
            }
        }
    }


    public static void main(String[] args)
    {
        //int N = Integer.parseInt(args[0]);
        System.out.println("Enter N value");
        Scanner s=new Scanner(System.in);
        int N=s.nextInt();
        enumerate(N);
    }
}
于 2013-07-18T09:58:19.433 回答