八皇后问题
这是一个经典递归问题,问题要求:在一个n*n的棋盘上摆放n个皇后,要求两个皇后不能出现在同一横排,纵列,斜线上。
下图是8*8的棋盘:
运用递归的方法可以很容易实现出来,得到结果显示这种棋盘n=8的情况下有92中摆放方式。
#include <stdio.h>
#include <stdlib.h>
const int N = 8;//
int queens[N] = {0};//每一行都有且只有1个皇后,保存数据表示位于第几列 0~7
int count =1 ;
void printqueen()
{
printf("case:%d\n",count);
int i,j;
for (i = 0;i<N ;i++ )
{
printf("%d",queens[i]);
}
printf("\n=======棋盘=======:\n");
for (i = 0;i<N ;i++ )
{
j = 0;
while(j<queens[i])
{
printf("0 ");
j++;
}
printf("1 ");
j = queens[i]+1;
while(j<N)
{
printf("0 ");
j++;
}
printf("\n");
}
printf("==================\n");
}
bool oneline(int order)//在一条线上false
{
int i=0;
while(i<order)
{
if (queens[order] == queens[i])
return true;
if(abs(queens[order] - queens[i]) == (order - i))
return true;
i++;
}
return false;
}
void eightqueen(int num)
{
if (num >7)
{
printqueen();
count++;
return;
}
int i;
for (i = 0;i<N ;i++ )
{
/*
queens[num] = i;
if(oneline(i,num))//第num行上位置i
{
continue;
}
else
{
//printf("queens[%d] = %d\n",num,queens[num]);
eightqueen(num+1);
}*/
queens[num] = i;
if(!oneline(num))
eightqueen(num+1);
}
//getchar();
}
int main()
{
eightqueen(0);
return 0;
}