您的位置:首页 > 编程语言 > C语言/C++

n皇后问题的两种递归方法C语言实现

2014-05-18 11:50 811 查看
1.递归回溯法

#include <stdio.h>
#include <math.h>
#define N 15

int x
; //皇后放置的列数
int n; //皇后个数
int sum=0; //可行解个数

int place(int k)
{
int i;
for(i=1;i<k;i++)
if(abs(k-i)==abs(x[k]-x[i])||x[k]==x[i])
return 0;
return 1;
}
int queen(int k)
{
int i;
if(k>n)
sum++;
else
for(i=1;i<=n;i++)
{
x[k]=i;
if(place(k))
queen(k+1);
}
return sum;
}
int main()
{
printf("Please input n:(n<15)");
scanf("%d",&n);
printf("%d\n",queen(1));
return 0;
}

2.迭代回溯法
#include <stdio.h>
#include <math.h>
#define N 15

int n;
int sum=0;
int x
;

int place(int k)
{
int i;
for(i=1;i<k;i++)
if(abs(k-i)==abs(x[k]-x[i])||x[k]==x[i])
return 0;
return 1;
}
int queen()
{
int t=1;
x[1]=0;
while(t>0)
{
x[t]++;
while(x[t]<=n&&!place(t))
x[t]++;
if(x[t]<=n)
{
if(t==n)
sum++;
else
x[++t]=0;
}
else
t--;
}
return sum;
}
int main()
{
printf("Please input n:(n<15)");
scanf("%d",&n);
printf("%d\n",queen());
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  n皇后问题 C