自己写的一个八皇后,能够完整的输出92种结果,其中的冲突判断部分比较笨,还会继续优化
//判断是否冲突
int peace(int row,int column)
{
int i=row-1;
int j=column;
while(i>=0){
if(queen[i][j]==1)
return 0;
--i;
}
i=row-1;
j=column-1;
while(i>=0&&j>=0){
if(queen[i--][j--]==1){
return 0;
}
}
i=row-1;
j=column+1;
while(i>=0&&j<num){
if(queen[i--][j++]==1){
return 0;
}
}
return 1;
}
//打印
void print()
{
int i=0;
int j=0;
for(i=0;i<num;++i){
for(j=0;j<num;++j){
if(queen[i][j]==1){
printf("#");
}
else{
printf("*");
}
}
printf("\n");
}
printf("\n");
printf("************************************\n");
printf("\n");
++count;
}
//主控制算法
void eight_queen(int row)
{
int i=0;
for(;i<num;++i){
if(peace(row,i)){
queen[row][i]=1;
if(row == (num-1)){
print();
exit(0);
}
else{
eight_queen(row+1);
}
queen[row][i]=0;
}
}
}
在main函数中调用eight_queen(0)即可
上边采用二维数组保存棋盘,实际上还可一用一维数组,并且一维数组在判断冲突时更加方便,代码如下
#include<stdio.h>
int count=0;
#define num 8
int queen[num+1]={0};
int peace(int row,int column)
{
for(int i=1;i<row;++i){
if((i-queen[i])==(row-column)||(i+queen[i])==(row+column)||queen[i]==column)
return 0;
}
return 1;
}
void print()
{
int i=1;
for(;i<=8;++i){
int j=1;
for(;j<=8;++j){
if(j==queen[i]){
printf("#");
}
else{
printf("*");
}
}
printf("\n");
}
++count;
printf("\n");
printf("This is number %d\n",count);
printf("******************************\n");
printf("\n");
}
void eight_queen(int row)
{
int i=1;
for(;i<=num;++i){
if(peace(row,i)){
queen[row]=i;
if(row == num){
print();
}
else{
eight_queen(row+1);
}
}
}
}
int main()
{
eight_queen(1);
}
需要注意的是,为什么第一种方法有一句queen[row][i]=0,而第二种方法没有类似语句,这也是理解回溯的关键