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;
}
#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;
}
相关文章推荐
- C语言,数组实现约瑟夫环问题(两种方法)
- 【C语言】用递归和循环两种方法实现单链表倒置
- 8皇后问题(递归方法实现)
- C语言实现斐波那契数列的两种方法(递归和迭代)
- 八皇后 c语言递归实现方法(带注释)
- STL学习笔记:用非递归的方法实现汉诺塔问题
- 处理JSP中文跨页面间传参乱码的问题有两种方法实现方法(每个搞JSP的最常遇到的问题之一) 实例版:)
- Hanoi塔问题 栈与递归C语言编程实现
- 递归实现回溯法求n皇后问题
- 面试题:单链表逆置(分别用非递归和递归两种方法实现)
- 一列数字的规则如下;1,1,2,3,5,8,13,21,34........ 求第30位数字是多少,用递规和非递归两种方法算法实现
- c语言用递归的方法实现1!+2!+3!+4!+.....+n!=?阶乘之和
- 递归求解N皇后问题(c语言)
- 通过8皇后问题浅析回溯法的递归实现
- c语言strstr实现的两种方法
- C语言 N阶汉诺塔问题的递归实现
- 火车调度问题的两种解决方法(C语言描述)
- 遇到的一个设计问题,两种方法的实现
- 生产者与消费者问题是典型的同步问题。这里简单介绍两种不同的实现方法。
- 深度优先—递归方法 求解n皇后问题