在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;
}