我们先来康康这个题:N皇后问题
这个题就是用递归来做啦
想要找到一个符合条件的方案,那么就需要将所有皇后放在合适的位置,那么最后一个皇后放的基础就是前N-1行的皇后都放好,那么第N-1行的皇后放的基础就是前N-2行的皇后都放好,以此类推。
那么我们的递归函数做的就是将第k行的皇后放置好。
当k>n时,计数加一,递归结束。
其他情况时则从第一列到第N列进行试探,与已排好序的前k-1个皇后进行比较。
void dfs(int k)
{
int i,j;
if(k>=n+1)
{
count++;
return ;
}
for(i=1;i<=n;i++)
{
for(j=1;j<k;j++)
{
if(i==a[j]||abs(i-a[j])==abs(k-j))
{
break;
}
}
if(j==k){
a[k]=i;
dfs(k+1);
}
}
return ;
}
数组a中记录已排好序的皇后的列序号。
这里注意条件
if(i==a[j]||abs(i-a[j])==abs(k-j))
代码实现
#include<stdio.h>
#include<math.h>
int n,count=0;
int a[15]={0};
void dfs(int k)
{
int i,j;
if(k>=n+1)
{
count++;
return ;
}
for(i=1;i<=n;i++)
{
for(j=1;j<k;j++)
{
if(i==a[j]||abs(i-a[j])==abs(k-j))
{
break;
}
}
if(j==k){
a[k]=i;
dfs(k+1);
}
}
return ;
}
int main()
{
int i;
while(scanf("%d",&n)!=EOF&&n!=0)
{
for(i=1;i<=n;i++)
{
a[i]=0;
}
count=0;
dfs(1);
printf("%d\n",count);
}
return 0;
}
不知道为什么超时
所以最后打表处理了= =