私は8 クイーン パズルの解決策を開発しようとしています。8 x 8 のチェス盤に 8 クイーンを配置して、2 人が互いに攻撃できないようにする必要があります。「#」のボードを印刷することはできますが、最初のスポットにクイーンを配置し、水平、垂直、斜めのすべてのスポットを「x」にする方法がわかりません。
これが私がこれまでに持っているものです:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define ROW 8
#define COL 8
// Make the chessboard
int main(int argc, char * argv[])
{
char board[ROW][COL];
int i, j;
for(i = 0; i < ROW; i++)
{
for(j = 0; j < COL; j++)
{
board[i][j] = '#';
printf(" %c", board[i][j]);
}
printf("\n");
}
return 0;
}
// Place queen on first '#'
int placeQueen(char board[ROW][COL])
{
char queenSpace;
int i, j;
for(i = 0; i < ROW; i++)
{
for(j = 0; j < COL; j++)
{
queenSpace = 'Q';
board[i][j] = queenSpace;
printf(" %c", board[1][1]);
}
printf("\n");
}
return 0;
}
現在の出力は左側にあります。右側に示すようにする必要があります。
# # # # # # # # Q x x x x x x x
# # # # # # # # x x # # # # # #
# # # # # # # # x # x # # # # #
# # # # # # # # x # # x # # # #
# # # # # # # # x # # # x # # #
# # # # # # # # x # # # # x # #
# # # # # # # # x # # # # # x #
# # # # # # # # x # # # # # # x
これが私のアルゴリズムです:
- すべて「#」で 8x8 配列を作成します。
- 最初に利用可能な「#」にクイーンを配置します。
- 横、縦、斜めのすべての正方形をクイーンの位置から「x」に変更します。
- 「#」である最初のスポットに別のクイーンを配置します。
- 水平、垂直、および斜めのすべての正方形を新しいクイーンの位置から「x」に変更します。
- 使用可能な「#」がなくなるまで、手順 4 ~ 5 を繰り返します。
- > 7 クイーンの場合、配列を出力して再度実行します。
- クイーンが 7 個以下の場合は、もう一度実行しますが、2 番目のクイーンの位置に「#」を付けて、手順 4 ~ 5 を繰り返します。
- > 7 クイーンの場合、配列を出力して再度実行します。
- クイーンが 7 個以下の場合は、2 番目のクイーンの行に「#」がなくなるまでステップ 8 を繰り返します。
- 2 番目のクイーンの行に「#」がない場合は、その行からメモリを解放します。
- 手順 8 を繰り返しますが、3 番目のクイーンの位置を除きます。
- 手順 8 ~ 11 を繰り返しますが、4 番目のクイーンの位置を指定します。等。
- これ以上解決策がない場合は、手順 2 ~ 13 を繰り返しますが、今回は最初のクイーンがあった場所に「#」をマークします。
- 最初の行に「#」がなくなるまで、手順 14 を繰り返します。
私は 2 次元配列を使用した作業やプログラムを行ったことがないので、ヘルプやサンプル コードをいただければ幸いです。