问题不多说,相信大家都知道,直接上代码.
以下是两种解法:递归解法和回朔解法
#include <stdio.h>
#include <stdbool.h>
#define M 8 //修改此处改变皇后的基数
bool check(int *c,int addr);
void q(int k);
void display(int *c,int n);
void qt(int k);
int c[20]={0};
int main(void)
{
q(1); //非递归
printf("\n");
qt(1); //递归
return 0;
}
bool check(int *c,int k)
{
int i=0;
for(i = k-1;i>=1;i--)
{
if(c[i]==c[k]||(c[i]-c[k]==i-k)||(c[i]+i==c[k]+k)) return false;
}
return true;
}
void display(int *c,int n)
{
int i=0,j=0;
for(i=1;i<=n;i++)
printf("%d ",c[i]);
printf("\n");
}
//递归解法
void q(int k) //k代表深度
{
int i=0;
for(i=1;i<=M;i++)
{
c[k] = i;
if(check(c,k)) //判断当前皇后放置位置是否合理
{
if(k==M) //到达最后一层,输出
{
display(c,k);
}
else
{
q(k+1); //向下搜索
}
}
c[k] = 0;
}
}
//非递归解法
void qt(int k) //k代表深度
{
while(k>=1) //k=1为第一层
{
while(c[k]<M) //搜索一层
{
c[k]++;
if(check(c,k)) //判断当前皇后放置位置是否合理
{
if(k==M) //到达最后一层,输出
{
display(c,k);
}
else
{
k++; //向下搜索
}
}
}
c[k] = 0; //向上回朔,c[k]要初始化,防止数据污染
k--; //向上
}
}