分别设计一个n皇后问题递归和非递归算法,给出c代码
时间: 2024-01-23 12:04:09 浏览: 60
递归算法:
```c
#include<stdio.h>
#include<math.h>
#define N 8 // N为皇后的数量,可以根据需要进行修改
int x[N+1]; // 用于存放皇后的位置
int count=0; // 计数器,记录解的个数
bool place(int k) // 判断第k个皇后是否与前面的皇后冲突
{
for(int i=1;i<k;i++)
if(x[i]==x[k]||abs(x[i]-x[k])==abs(i-k)) return false;
return true;
}
void n_queen(int t) // t为当前处理的皇后编号
{
if(t>N) // 找到了一个解,输出并返回
{
count++;
printf("Solution %d:\t",count);
for(int i=1;i<=N;i++) printf("%d ",x[i]);
printf("\n");
return;
}
for(int i=1;i<=N;i++) // 枚举第t个皇后的位置
{
x[t]=i;
if(place(t)) n_queen(t+1); // 如果不冲突,继续递归
}
}
int main()
{
n_queen(1); // 从第一个皇后开始搜索
printf("Total solutions: %d\n",count);
return 0;
}
```
非递归算法:
```c
#include<stdio.h>
#include<math.h>
#define N 8 // N为皇后的数量,可以根据需要进行修改
int x[N+1]; // 用于存放皇后的位置
int count=0; // 计数器,记录解的个数
bool place(int k) // 判断第k个皇后是否与前面的皇后冲突
{
for(int i=1;i<k;i++)
if(x[i]==x[k]||abs(x[i]-x[k])==abs(i-k)) return false;
return true;
}
int main()
{
int t=1; // 当前处理的皇后编号
x[1]=0; // 第一个皇后放在第0列(无实际意义)
while(t>0) // 回溯到第一个皇后之前结束
{
x[t]++; // 尝试下一个位置
while(x[t]<=N&&!place(t)) x[t]++; // 如果冲突,继续尝试下一个位置
if(x[t]<=N) // 找到了一个解,输出并继续搜索下一个皇后
{
if(t==N) // 找到了一个完整的解
{
count++;
printf("Solution %d:\t",count);
for(int i=1;i<=N;i++) printf("%d ",x[i]);
printf("\n");
}
else // 没有找到完整的解,继续搜索下一个皇后
{
t++;
x[t]=0; // 下一个皇后从第0列开始搜索
}
}
else // 没有找到解,回溯到上一个皇后
{
t--;
}
}
printf("Total solutions: %d\n",count);
return 0;
}
```
阅读全文