2012-04-05 8 views
2
  • 私は自分のスタックの実装を使用しています。
  • 再帰は使用しないでください。

マイコード:JavaでのN女王の宿題の問題

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"変数をスタッククラスに格納して、どの行にあるのかを示します。

+4

私はあなたが最初に書いて、再帰的なソリューションをデバッグして、スタックを使用してに変換をお勧めします。私が長年にわたって見てきた8つの女王問題の最良の治療法は、Dijkstra(この本の72ページ(http://www.informatik.uni-bremen.de/agbkb/lehre/)から始まります。 programmierspra​​chen/artikel/EWD-notes-structured.pdf))。あまりにも早く創造的なことをしないでください。最適化されたソリューションをデバッグするよりも、デバッグされたソリューションを最適化する方が簡単です。 – dasblinkenlight

+5

[Java命名規則](http://www.javaranch.com/style.jsp) - 大文字の場合はクラス名の最初の文字のように考えてください。これは特に、断片を見ているこのようなシナリオでは役に立ちます。 –

+0

リンクのための@ringbearerありがとう、私は通常、クラス名の最初の文字を大文字にしていますが、なぜそれに注意を払わなかったのか分かりません。 – b3gun

答えて

0

queenStackの要素のセクション

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

数がBSIZEを超える中に内部で消去の要素を開始する前に。

あなたはwhile(done == false && queenLoc.size() != bsize)です。したがって、queenLocのサイズがbsizeに等しい場合は結果を出力します。

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

アドバイス:あなたのコードには不変の「queenLocは互いに2人のクイーンが攻撃しない位置を表す」必要があります。

+0

あなたは正しいです、私はあなたが今言ったようにしましたが、私はブートループにこだわっています。私は問題がisSafe関数にあると思うが、何が原因であるのかわからない... – b3gun

+0

問題は本当に混乱している。私のコードではどこに問題が残っているのだろう。 – b3gun

+0

次にisSafeを変更してみてください。例えば、各女王のためにチェス盤上の正確な位置を計算する。次に、(x1、y1)のクイーンが(x2、y2)でクイーンを攻撃するかどうかをチェックすることはかなり簡単です。 'x1 == x2 || y1 == y2 || Math.abs(x1-x2)== Math.abs(y1-y2) 'です。 –

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

     } 


    } 




}