- 私は自分のスタックの実装を使用しています。
- 再帰は使用しないでください。
マイコード: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"変数をスタッククラスに格納して、どの行にあるのかを示します。
私はあなたが最初に書いて、再帰的なソリューションをデバッグして、スタックを使用してに変換をお勧めします。私が長年にわたって見てきた8つの女王問題の最良の治療法は、Dijkstra(この本の72ページ(http://www.informatik.uni-bremen.de/agbkb/lehre/)から始まります。 programmiersprachen/artikel/EWD-notes-structured.pdf))。あまりにも早く創造的なことをしないでください。最適化されたソリューションをデバッグするよりも、デバッグされたソリューションを最適化する方が簡単です。 – dasblinkenlight
[Java命名規則](http://www.javaranch.com/style.jsp) - 大文字の場合はクラス名の最初の文字のように考えてください。これは特に、断片を見ているこのようなシナリオでは役に立ちます。 –
リンクのための@ringbearerありがとう、私は通常、クラス名の最初の文字を大文字にしていますが、なぜそれに注意を払わなかったのか分かりません。 – b3gun