烟台大学 计算机学院 王朝 软件工程
#include <stdio.h>
#include <math.h>
#include<malloc.h>
int place(int *x,int k);//判断是否在同一列或斜线
void NQueens(int *x,int n);
int main()
{
int n;
int *x;
scanf("%d",&n);//输入N
x=(int*)malloc(sizeof(int)*(n+1));//分配动态储存空间
NQueens(x,n);
return 0;
}
int place(int *x,int k)
{
int i;
for(i=0; i<k; i++)
{
if(x[i]==x[k]||(fabs(i-k)==fabs(x[i]-x[k])))
return 0;
}
return 1;
}
void NQueens(int *x,int n)
{
int k=1;//K代表第1行
x[k]=0;//x数组表示列
while(k>=1)//循环条件
{
x[k]++;//进入循环变为第一列
while(x[k]<=n&&place(x,k)==0)//列数未超,并判断是否在同一列或斜线
x[k]++;
if(k==n&&x[k]<=n)//行数达到N,并且列未超过N.
{
int i;
for(i=1; i<=n; i++)
printf("%d ",x[i]);
printf("\n");
}
else if(k<n&&x[k]<=n)//行数未达到N
{
k++;
x[k]=0;
}
else
k--;
}
}
回溯法之N皇后问题
最新推荐文章于 2024-03-06 14:26:26 发布