#include <stdlib.h>
#define ASSERT
typedef enum {FALSE, TRUE} Bool;
void (int curRow);
Bool canPlace(int curRow, int k);
void placeQueen(int curRow, int k);
void printResult(void);
int N = 8;
int *board;
int main(int argc, char* argv[])
{
if (argc >= 2)
sscanf(argv[1], "%d", &N);
if ((board = malloc(N * sizeof(int))) == NULL)
{
fprintf(stderr, "No available memory!n");
exit(EXIT_FAILURE);
}
for (int i = 0; i < N; i++)
board[i] = 2 * N + 1;
eightQueen(0);
return 0;
}
Bool canPlace(int curRow, int k)
{
for (int i = 0; i < curRow; i++)
{
if (board[i] == k || abs(i - curRow) == abs(k - board[i]))
return FALSE;
}
return TRUE;
}
void placeQueen(int curRow, int k)
{
board[curRow] = k;
}
void (int curRow)
{
if (curRow == N)
printResult();
else
for (int k = 0; k < N; k++)
if (canPlace(curRow, k))
{
placeQueen(curRow, k);
eightQueen(curRow + 1);
}
}
void printResult(void)
{
static int resultNum = 1;
printf("nnnresult %d:n", resultNum);
#ifdef ASSERT
for (int i = 0; i < N; i++)
printf("%d --- %dn", i, board[i]);
#endif
printf(" ");
for (int i = 0; i < N; i++)
printf("%2d ", i);
printf("n");
for (int i = 0; i < N; i++)
{
printf("%2d ", i);
for (int j = 0; j < N; j++)
{
if (j == board[i])
printf(" @ ");
else
printf(" . ");
}
printf("n");
}
resultNum++;
}
近期评论