八皇后问题(递归)

在n*n的方格棋盘上,放置n个皇后,要求每个皇后不同行,不同列,不同对角线。此题可用递归算法。

#include<stdio.h>
#define N 20//最多的皇后个数
int q[N];//存放各皇后所在的列号 
int cont=0;// 存放解个数
int abs(int i)//求绝对值
{
    if(i<0) return -i;
}
void print(int n){//输出一个解 
    int i;
    cont++;
    printf("第%d个解:",cont);
    for(i=1;i<=n;i++){
        printf("(%d,%d) ",i,q[i]);//(i,q[i])位置有一个皇后 
    } 
    printf("\n");
} 
int judge(int j,int k){//判断k,j能否放皇后 
    int i;
    for(i=1;i<k;i++){//i=1~k-1各行已放置了皇后
        if((q[i]==j) //判断是否同列
            ||(abs(q[i]-j)==abs(i-k))){ //(i,q[i])与(k,j)是否同对角线 
            return 0;//返回0,表示(k,j)不能放皇后 
        }
    }
    return 1;
} 

void place(int k,int n){//从放第k个皇后开始求解 
    if(k>n){//所有皇后放置结束 
        print(n);//输出一个解 
    }
    else{
        int j;
        for(j=1;j<=n;j++){//在第k行上穷举每个列号j 
            if(judge(j,k)){
                q[k]=j;//在(k,q[k]处放一个皇后 
                place(k+1,n);//递归调用放余下的皇后 
            }
        }
    }
} 
int main(){
    place(1,8);//这里为八皇后问题
    return 0;
}
    原文作者:八皇后问题
    原文地址: https://blog.csdn.net/sinat_36570284/article/details/59109412
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞