2012-04-03 2 views
2

私はプログラマブルでは新しく、N Queensの問題を解決するこの課題があります。 私のコードに何が間違っているのか分かりません。私はかなりの時間を費やしました。 誰かが私を正しい方向に導いて助けてくれますか?クイーンズはスタックを使ってJavaでエクササイズを行います

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

スタッククラス、プッシュ、ポップ、大きさを持って、機能を取得する(リターンはint型とプッシュ機能のためのパラメータがint型である)

私はバックトラックとのスタックを使用してそれを解決する必要があり、再帰はありません。

編集:ところで、私はボードが他の印刷された私は何を取得取得し、1に

if(s.size() == size) 
    printBoard(column, size); 

置き換えサイズの変数を変更した場合。

編集: 問題はプッシュとポップですが、アルゴリズムはかなり正しくありません。なぜなら、私はスタック内の要素が1つしかないからです。

+0

もう少し具体的にしてください。何がうまくいかないのですか?間違いはありますか?あるいは、間違った答えを得るだけですか? –

+0

@SimonAndréForsberg私のコードに何か問題がありますが、エラーは発生していません。しかし、ボードを印刷するためにprint関数を呼び出すと、何も表示されません。 – b3gun

+0

あなたのロジックは、isSafe(column、size)== trueのチェックに向いているように見えますが、代わりにfalseをテストしています。 – phatfingers

答えて

0

2つの迅速な観測私はNクイーン問題に精通していないよ、とコメンターが述べたように、イムないあなたが直面している問題が何であるかを確認しますが、ここでは、次のとおりです。あなたisSafeで

  1. ( )メソッドでは、新しいスタックを初期化します(したがって空になります)。次に、if条件でチェックを実行してコンテンツを決定します。このメソッドは常にtrueを返します。mainメソッドで作成したスタックをこれに?

  2. 非常にマイナーな観察が、あなたはいけないブール型の文が「== false」に必要がある場合を行う - (!isSafe(列、サイズは))十分である場合(通知は私が追加偽チェックのために!)

+0

私は言ったように、私はメインのスタックのインスタンスを作成し、それを他の関数に渡しました。それでも同じ問題があります。 – b3gun

2

"N Queens"の問題は、8人のクイーンを1人のクイーンが1人も他のクイーンを捕まえることができないようにチェスボードに置かなければならないという "8クイーンズ"問題を思い起こさせます。これは任意の数のクイーンに拡張することができます(チェスボードが適切な大きさである限り)。パズルは再帰によく適しており、しばしば再帰に関する章で教えられます。パズルにはlinkがあります。

あなたはstackを使用できますが、recursionは使用できないとします。再帰は実際にはスタックを使って動作します(明示的に対話することはありません)。つまり、代わりにスタックを使用して再帰関数を記述することができます。このような状況では、スタックを使用して関数パラメータやその他の関連変数を追跡します。より具体的には、新しい再帰関数が呼び出されると、関数内の現在のローカル・データがすべてスタックにプッシュされます。再帰呼び出しを終了した後にデータを取得する必要がある場合、スタックの先頭のデータがポップアウトされ、再度使用されます。

問題を解決するために再帰関数を最初に記述してから、再帰的な解をスタックで反復的に「変換」する方法を理解する方が簡単かもしれません。反復的に解を書くことを試み、バックトラッキングが機能するためにどの情報を追跡する必要があるかを把握することも良い考えです。私はあなたもクイーンズの位置を格納するために1D配列を使用していることに気付いたが、2D配列を先に使ってパズルをよりよく視覚化すると便利かもしれない。これにより、プログラミングもより簡単になります。

+0

私は同意します。私は実際には反復的ではなく反復的に使用する必要があります。私は2D配列を使うでしょう、私はそれが最善の方法だと思います。 1D配列は列を格納するだけです、私は実際にスタックに行を格納しています。私は行と列を持つ配列を返すスタックの自分の実装を変更すると思った。 – b3gun

+0

1Dアレイは非常に効率的ですが、実装するのが難しい場合があります。また、スタックに配列を格納しないでください。 * 2つの*値を毎回(行と列)スタックにプッシュしてポップする方が良い考えです: 'stk.push(row); stk.push(col) 'を呼び出し、次に取得する:' col = stk.pop(); row = stk.pop() ' – collinjsimpson

+0

mmm、これはさらに優れています。あなたが言ったようにします。私はちょうど解決とチェック機能について私のalgoについてyeatではない。あなたはそれらをチェックしましたか?私はまだ疑問... – b3gun

関連する問題