转载:http://blog.sina.com.cn/s/blog_696187fd0100p5ri.html
一、问题描述:
输入:
输出:
二、解题思路:
三、复杂度分析:
四、测试代码:
递归回溯:
-
- #include<stdio.h>
- #define
N 15 -
- int
n; //皇后个数 - int
sum = 0; //可行解个数 - int
x[N]; //皇后放置的列数 -
-
- 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) - {
-
if(t>n && n>0) //当放置的皇后超过n时,可行解个数加1,此时n必须大于0 -
sum++; -
else -
for(int i=1;i<=n;i++) -
{ -
x[t] = i; //标明第t个皇后放在第i列 -
if(place(t)) //如果可以放在某一位置,则继续放下一皇后 -
queen(t+1); -
} -
return sum; - }
-
- int
main() - {
-
int t; -
scanf("%d",&n); -
t = queen(1); -
if(n == 0) //如果n=0,则可行解个数为0,这种情况一定不要忽略 -
t = 0; -
printf("%d",t); -
return 0; - }
迭代回溯:
-
- #include<stdio.h>
- #define
N 15 -
- int
n; - int
sum = 0; - int
x[N]; -
- 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() - {
-
x[1] = 0; -
int t=1; -
while(t>0) -
{ -
x[t]+=1; -
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() - {
-
int t; -
scanf("%d",&n); -
t = queen(); -
printf("%d",t); -
return 0; - }