[C]エイトクイーン
#include "NQueen.h"
#define QUEEN_NUM (8)
#define CAN_SET (0)
static void ChangeBoard(int board[QUEEN_NUM][QUEEN_NUM], int i , int j, int d);
static void SetQueen(int queen[QUEEN_NUM], int board[QUEEN_NUM][QUEEN_NUM], int i);
static int s_num;
static void ChangeBoard(int board[QUEEN_NUM][QUEEN_NUM], int i , int j, int d)
{
int k = 0;
int offset = 0;
for (k = 0; k < QUEEN_NUM; k++)
{
board[i][k] += d;
board[k][j] += d;
}
if (i > j)
{
for (k = 0; k < (QUEEN_NUM - (i - j)); k++)
{
board[k + (i - j)][k] += d;
}
}
else
{
for (k = 0; k < (QUEEN_NUM - (j - i)); k++)
{
board[k][k + (j - i)] += d;
}
}
if ((i + j) < QUEEN_NUM)
{
for (k = 0; k <= (i + j); k++)
{
board[(i + j) - k][k] += d;
}
}
else
{
for (k = (i + j - QUEEN_NUM + 1); k < QUEEN_NUM; k++)
{
board[(i + j) - k][k] += d;
}
}
}
static void SetQueen(int queen[QUEEN_NUM], int board[QUEEN_NUM][QUEEN_NUM], int i)
{
int j = 0;
if (i == QUEEN_NUM)
{
/* 解が見つかった */
int i = 0;
int j = 0;
printf("%d 個目\n", s_num++);
for (i = 0; i < QUEEN_NUM; i++)
{
for (j = 0; j < QUEEN_NUM; j++)
{
if (queen[i] == j)
{
printf("o ");
}
else
{
printf("x ");
}
}
printf("\n");
}
printf("\n");
return;
}
for (j = 0; j < QUEEN_NUM; j++)
{
if (board[i][j] == CAN_SET)
{
queen[i] = j;
ChangeBoard(board, i, j, 1);
SetQueen(queen, board, i + 1);
ChangeBoard(board, i, j, -1);
}
}
}
void FindAllPattern(void)
{
int queen[QUEEN_NUM] = {'\0'};
int board[QUEEN_NUM][QUEEN_NUM] = {'\0'};
SetQueen(queen, board, 0);
}