/***********************************************************
N个皇后放置到N*N的棋盘上,要求每两个皇后都不在一条直线上
**********************************************************/
#include <stdio.h>
#define QUEEN_NUM 4int position[QUEEN_NUM] = {0};
/* x表示第几列,y表示第几行 */
int valid_place(int a[][QUEEN_NUM], int x, int y)
{
int i;
/* 横着一条无多余1个皇后 */
for(i = 0; i < QUEEN_NUM; i++)
{
if(1 == a[y][i])
{
printf("tong yi hang \n");
return -1;
}
}
/* 竖着一列无多余1个皇后 */
for(i = 0; i < QUEEN_NUM; i++)
{
if(1 == a[i][x])
{
return -1;
}
}
/* 正对角线无多余一个皇后 */
for(i = 0; (y-i)>=0 && (x-i) >= 0; i++ )
{
if( 1 == a[y-i][x-i] )
{
return -1;
}
}
/* 反对角线无多余一个皇后 */
for(i = 0; (x+i) < QUEEN_NUM && (y-i) >= 0; i++)
if(1 == a[y-1][x+1])
{
return -1;
}
return 0;
}
void display_queen(int a[][QUEEN_NUM])
{
int i,j;
for(i = 0; i < QUEEN_NUM ; i++)
for(j = 0; j < QUEEN_NUM ; j++)
{
if (0 == a[i][j])
{
printf("0");
}
else
{
printf("X");
}
if( QUEEN_NUM-1 == j)
{
printf("\n");
}
}
printf("Display DONE ! \n");
}
int place_queens(int a[][QUEEN_NUM])
{
int i; /* i表示横排 */
int j = 0; /* j表示纵列 */
int k = 0;
while(j >= 0)
{
if(QUEEN_NUM == j)
{
/* 所有皇后都放置完成 */
display_queen(a);
a[j-1][position[j-1]] = 0;
k = position[j-1]+1; /* 从前面一个皇后位置的下个位置开始 */
j--;
}
for(i = k ; i < QUEEN_NUM ; i++)
{
if(0 == valid_place(a,i,j))
{
a[j][i] = 1;
position[j] = i;
j++;
k = 0; /* 放置下一个皇后,则从第一个位置开始 */
break;
}
}
/* 所有位置都非法,则回溯 */
if(QUEEN_NUM == i)
{
if(0 == j)
{
return -1;
}
a[j-1][position[j-1]] = 0;
k = position[j-1]+1; /* 从前面一个皇后位置的下个位置开始 */
j--;
}
}
return -1;
}
int main(int argc, char **argv)
{
int i;
int j;
int a[QUEEN_NUM][QUEEN_NUM];
for(i = 0; i < QUEEN_NUM ; i++)
for(j = 0; j < QUEEN_NUM ; j++)
a[i][j] = 0;
if (-1 == place_queens(a) )
{
printf("Over\n");
return -1;
}
}