#include <stdio.h>
#include <stdlib.h>
char Chessboard[8][8]; /* 声明8*8的空白棋盘 */
/* ---------------------------------------------------*/
/* 递归解N皇后问题 */
/* ---------------------------------------------------*/
int N_Queens(int LocX,int LocY,int Queens)
{
int i,j; /* 循环计数变量 */
int Result=0;
if ( Queens == 8 ) /* 递归结束条件 */
return 1;
else /* 递归执行部分 */
if ( QueenPlace(LocX,LocY) )
{
Chessboard[LocX][LocY] = 'Q';
for (i=0;i<8;i++) //针对每一行
for (j=0;j<8;j++) //一行中的各个位置进行判断
{
Result += N_Queens(i,j,Queens+1);
if (Result > 0)
break;
}
if (Result > 0)
return 1;
else //上述循环后result=0,就不是break跳出的
{
Chessboard[LocX][LocY] = 'X';
return 0;
}
}
else
return 0;
}
/* --------------------------------------------------- */
/* 判断传入坐标是否可放置皇后 */
/* --------------------------------------------------- */
int QueenPlace(int LocX,int LocY)
{
int i,j;
if (Chessboard[LocX][LocY] != 'X') /* 判断是否有皇后 */
return 0;
for (j=LocY-1;j>=0;j--) /* 判断上方是否有皇后 */
if (Chessboard[LocX][j] != 'X')
return 0;
for (j=LocY+1;j<8;j++) /* 判断下方是否有皇后 */
if (Chessboard[LocX][j] != 'X')
return 0;
for (i=LocX-1;i>=0;i--) /* 判断左方是否有皇后 */
if (Chessboard[i][LocY] != 'X')
return 0;
for (i=LocX+1;i<8;i++) /* 判断右方是否有皇后 */
if (Chessboard[i][LocY] != 'X')
return 0;
i = LocX - 1;
j = LocY - 1;
while ( i>=0 && j>=0 ) /* 判断左上方是否有皇后 */
if (Chessboard[i--][j--] != 'X')
return 0;
i = LocX + 1;
j = LocY - 1;
while ( i<8 && j>=0 ) /* 判断右上方是否有皇后 */
if (Chessboard[i++][j--] != 'X')
return 0;
i = LocX - 1;
j = LocY + 1;
while ( i>=0 && j<8 ) /* 判断左下方是否有皇后 */
if (Chessboard[i--][j++] != 'X')
return 0;
i = LocX + 1;
j = LocY + 1;
while ( i<8 && j<8 ) /* 判断右下方是否有皇后 */
if (Chessboard[i++][j++] != 'X')
return 0;
return 1;
}
/* --------------------------------------------------- */
/* 主程序 */
/* --------------------------------------------------- */
void main ()
{
int i,j; /* 循环计数变量 */
for (i=0;i<8;i++)
for (j=0;j<8;j++)
Chessboard[i][j] = 'X';
N_Queens(0,0,0);
printf("The graph of 8 Queens on the Chessboard.\n");
printf(" 0 1 2 3 4 5 6 7 \n");
printf(" +---+---+---+---+---+---+---+---+\n");
for (i=0;i<8;i++)
{
printf(" %d |",i);
for (j=0;j<8;j++)
printf("-%c-|",Chessboard[i][j]);
printf("\n +---+---+---+---+---+---+---+---+\n");
}
system("pause");
}
八皇后问题
最新推荐文章于 2023-07-07 14:04:01 发布