dfs——n皇后问题
C - N皇后问题
#include<iostream> #include<cstring> #include<algorithm> using namespace std; const int maxn=15; int ans[maxn]; //用ans数组来记录n*n阶乘两个皇后的摆放数 int n;//表示棋盘的大小 int ans1;//ans1为摆放数 int ye[maxn]={0}; bool ok(int x,int y){//用于判断所放位置的皇后是否符合要求。 //若ok输出true,否则就false for(int i=0;i<x;i++) if(ye[i]==y||(x+y==i+ye[i])||(x-y==i-ye[i])) return false; return true; } void dfs(int x1){//深度优先搜索//x1表示为行数 if(x1==n){ ans1++; return ; } for(int y1=0;y1<n;y1++){//在每一列放皇后;y1表示为列数 if(ok(x1,y1)){//检查是否合法 ye[x1]=y1;//在第x1 行的 y1 列放皇后 bfs(x1+1);//回溯//继续放下一行皇后 } } } int main(){ int i;int j; memset(ans,-1,sizeof(ans));//将ans数组赋为-1,用于打表,减少时间复杂度 while(scanf("%d",&n)!=EOF){ if(n==0)break; if(ans[n]<0){//当ans【n】<0,即该情况下未被计算,进行计算 //若不<0,则直接输出ans【n】中的值 //算出所有 n 皇后的答案。先打表不然会超时 memset(ye,0,sizeof(ye)); //清空,准备计算下一个 N 皇后问题 ans1=0; dfs(0);//开始搜索 ans[n]=ans1; printf("%d\n",ans[n]); } else printf("%d\n",ans[n]); } return 0; }
这道题用dfs(深度优先搜索)来做的,
这道要注意的是要打表,否则就会超时。打表能节约计算,节约时间。
该题可作为做dfs题的模板。