八皇后问题(递归)

来源:互联网 发布:xp怎么打开445端口 编辑:程序博客网 时间:2024/06/04 23:36

在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;}
0 0
原创粉丝点击