在Java中进行N女王作业练习的问题

时间:2012-04-05 16:30:04

标签: java algorithm

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

我的代码:

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函数只在第一行打印皇后。 我实际上尝试了很多可能性,但我有点困惑。

任何人都可以指出我正确的方向并告诉我代码中的问题在哪里。我正在使用堆栈来存储列和堆栈类中的“count”变量,以指向哪一行。

3 个答案:

答案 0 :(得分:0)

在开始删除内部部分

中的元素之前
while(queenLoc.getTop() == bsize)
{
    y = queenLoc.pop();
    count--;
}

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

你有while(done == false && queenLoc.size() != bsize)所以当queenLoc的大小等于bsize时,你将打印结果。

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

建议:你的代码应该是不变的“queenLoc代表没有两个女王互相攻击的位置”。

答案 1 :(得分: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);
    }
}

答案 2 :(得分:0)

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++;

        }


    }




}