八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于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种。