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

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 に答える
0

内部 while セクションの要素の消去を開始する前に

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

QueenStack の要素数が bsize を超えます。

QueenLocwhile(done == false && queenLoc.size() != bsize)のサイズが bsize と等しくなると、結果が出力されます。

私が言っているのは、bsizeステップの後は常に結果を出力しているということです。

アドバイス: あなたのコードには、「queenLoc は 2 つのクイーンが互いに攻撃しない位置を表す」という不変条件が必要です。

于 2012-04-05T17:01:14.780 に答える