问题描述:
N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。
输入皇后数n,输出解,并且打印出n个皇后的坐标。
主要原理是递归方式深度优先搜索。不难理解,上代码:
//n皇后
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define N 20 //最大皇后个数
int q[N+1]={0}; //q[i]表示第i行的皇后的列号
int count=0; //解的个数
int judge(int i,int j){ //判断i行j列是否可放
for(int x=1;x<=i-1;x++){
if(q[x]==j) return 0; //同一列
else if(abs(i-x)==abs(j-q[x])) return 0; //同一个斜线
}
return 1;
}
void print(int n)
{
int i,j;
count++;
printf("第%d个解:",count);
for(i=1;i<=n;i++)
printf("(%d,%d) ",i,q[i]);
printf("\n");
for(i=1;i<=n;i++) //行
{
for(j=1;j<=n;j++) //列
{
if(q[i]!=j)
printf("x ");
else
printf("Q ");
}
printf("\n");
}
}
void place(int k,int n){ //放皇后,第k行
if(k>n){
print(n);//count++;
}
else{
for(int j=1;j<=n;j++){ //从1到n列
if(judge(k,j)){ //查找可以放皇后的位置
q[k]=j; //保存位置
place(k+1,n);
}
}
}
}
int main(){
q[1]=1;
int n; //皇后数
scanf("%d",&n);
place(1,n);
return 0;
}