[C]エイトクイーン | Assertion Failed!

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