八皇后问题(递归回溯)

/**
 * function:八皇后问题。每一行、每一列以及对角线不能有两个皇后。(递归回溯)
 * author:顾博君
 * time:2013-1-26
 */
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define MAXN 20
int n;
int col[MAXN+1],a[MAXN+1],b[2*MAXN+1],c[2*MAXN+1];//标记变量
//打印函数
void print(){
    int i,j;
    printf("列\t行\n");
    for(j=1;j<=n;j++)
        printf("%3d\t%d\n",j,col[j]);
    fflush(stdin);//清空缓冲区
    for(i=0;i<n;i++)
        printf("--");//输出横线
    printf("\n");
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            if(col[i]==j)
                printf("%2d",1);
            else
                printf("%2d",0);
        }
        printf("\n");
    }

    scanf("%*c");//暂停
    system("cls");//清屏
}

void queen_all(int k,int n){
    int i,j;
    for(i=1;i<=n;i++){
        if(a[i]&&b[k+i]&&c[n+k-i]){//如果符合条件
            col[k]=i;
            a[i]=b[k+i]=c[n+k-i]=0;//标记为已占用
            if(k==n){
                print();//输出结果
            }
            queen_all(k+1,n);
            a[i]=b[k+i]=c[n+k-i]=1;//标记为未占用
        }
    }
}
int queen_one(int k,int n){
    int i,found;
    i=found=0;
    while(!found&&i<n){//如果没有找到
        i++;
        if(a[i]&&b[k+i]&&c[n+k-i]){
            col[k]=i;
            a[i]=b[k+i]=c[k+n-i]=0;//标记为已占用
            if(k==n)return 1;
            else
                found=queen_one(k+1,n);
            a[i]=b[k+i]=c[n+k-i]=1;//标记为未占用
        }
    }
    return found;
}

int main(){
    int j;
    int count=0;
    printf("Enter n:");
    scanf("%d",&n);//输入n
    for(j=0;j<=n;j++)a[j]=1;//标记变量初始化
    for(j=0;j<=2*n;j++)b[j]=c[j]=1;//标记变量初始化
    queen_all(1,n);
    //printf("%d",queen_one(1,n));
}

你可能感兴趣的:(八皇后问题(递归回溯))