最近在自学DFS,N个皇后是一个DFS的经典应用,主要思想是递归。
学习时,我参考了:https://blog.csdn.net/coding_or_dead/article/details/52487854
注释中加入了一些自己的理解
代码:
#include <stdio.h>
#include<cstdlib>
using namespace std;
int map[12],ans[12];
int n,m,temp;
void dfs(int ceng) //定义递归——深度优先搜索(dfs)寻找符合要求的摆放方法
{
int flag,lie,k;
if (ceng==n+1) { //如果搜索到了n+1层,符合条件的情况加一,返回上一步(dfs(n))继续搜索符合条件的摆放方法
temp++;
return ;
}
for (lie=1; lie<=n; lie++) { //第一(n)个皇后可以摆在从1到n的某个位置上
map[ceng]=lie; //第ceng层的皇后摆放在第lie列
flag=1; //标记flag=1
for (k=1; k<ceng; k++) { //判断此ceng的皇后放在该列是否符合题意,不符合flag=0,lie++直到符合
if ((map[k]==lie)||(abs(k-ceng)==abs(map[k]-map[ceng]))) {
flag=0;
break;
}
}
if (flag) { //再搜寻第ceng+1层符合条件的摆放位置
dfs(ceng+1);
}
}
}
int main()
{
for (n=1; n<=10; n++) //计算1到10棋盘各个情况的方法数,n与dfs函数中的参数lie的最大值n相对应。
{
temp=0;
dfs(1);
ans[n]=temp;
}
while (scanf("%d",&m)!=EOF&&m) {
printf("%d\n",ans[m]);
}
return 0;
}
感觉明白DFS的思想,可是拿到题直接蒙住,不知道怎么用,感觉还是要多练习。
哎,紧张。。。不知道什么时候才能自己独立解决一道题。