八皇后问题(回溯法)

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。  92种

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define N 8
int x[N];
int sum=1;
int is_safe(int );
void output();
//第几个k代表皇后,x[k]代表在k列。
int main(){
    int k;
    k=1; x[k]=0;
    while(k>0){
        x[k]++;
        while(!is_safe(k)&&x[k]<=N)
            x[k]++;
        if(x[k]<=N){
            if(k==N){
                printf("%d皇后问题第%d解法!\n",N,sum);
                output();
                //return 0;//加则只求一个解,不加则全部解
            }
            else {
                k++;
                x[k]=0;
            }
        }
        else
            k--;
    }
    printf("共有 %d 种位置方法!",sum-1);
    return 0;
}
int is_safe(int k){
    int i;
    for(i=1;i<k;i++)
        if(x[i]==x[k]||abs(i-k)==abs(x[i]-x[k]))
            return 0;
    return 1;
}
void output(){
    int i;
    for(i=1;i<=N;i++){
        printf("(%d,%d) ",i,x[i]);
    }
    printf("\n");
    sum+=1;

}

一共92种。

猜你喜欢

转载自blog.csdn.net/huang1600301017/article/details/81023090