0

重複の可能性:
C++でのダム8クイーンの問題

こんにちは私はこの質問に出くわしました**

チェス盤に8つの王を配置するすべての方法を印刷するアルゴリズムを記述して、同じ行、列、対角線を持つものがないようにします。

****

//initialize chess[i][j] to 0;
int king=100; //any other number except 0/1

for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
//select any one position for the first column... lets start with j=0,i=0
if(chess[i][j]!=1)
chess[i][j]=king;
//now we should cross all rows with value i and column with value j
chess[i][]=1; 
print(when chess[][]=king)
// we cannot enter king if chess[][]=1

}
}

対角部分も確認する方法は?また、考えられるすべてのケースを列挙する方法は?

事前に感謝します。

4

1 に答える 1

1

特定の質問に答えるには:

チェス盤の斜めの動きは常に(m、n)から(m +/- k、n +/- k)です。つまり、垂直方向と同じ数のスペースを水平方向に移動します。したがって、2つのクイーン(1つは(i、j)、もう1つは(p、q))が互いに対角線上で攻撃しているかどうかを確認するには、を確認しますabs(i-p) == abs(j-q)

(p、q)の女王が斜めに攻撃する可能性のあるすべての正方形を消すには、次の形式の4つのループが必要です。

for (i = p, j = q; i >= 0, j >= 0; i--, j--) { board[i][j] = 1 }

for (i = p, j = q; i >= 0, j < 8; i--, j++)  { board[i][j] = 1 }

for (i = p, j = q; i < 8, j < 8; i++, j++)   { board[i][j] = 1 }

for (i = p, j = q; i < 8, j >= 0; i++, j--)  { board[i][j] = 1 }

つまり、xの4つのアームすべてをクイーンを中心に歩き、ボードの端に当たるまで正方形を消します。

于 2011-03-30T14:16:12.750 に答える