还是原先那个模板,
void dfs(int step){
判断边界
尝试每一种可能 for(i=1;i<=n;i++){
继续下一步 dfs(step+1)
}
返回
}
我们只要考虑好每一种情况就行, 如题每一个皇后不能在对角线和同一行同一列,所以我们要保证每条线上只有一个皇后如图:
看这张图就很好理解了就是运用高中的知识我们如何保证一个xy图形每条线上只有一个元素?
画张图
那么思路有了就上代码
#include <iostream>
using namespace std;
char a[21][21];
int dg[21],udg[21],col[11];
int n;
void dfs(int std){
int y,i;
if(std==n){
for (i = 0; i < n; i ++ ) puts(a[i]);
puts("");
return;
}
int x=std;
for(y=0;y<n;y++){
//如果列,对角线,副对角线都是0代表就是说没有皇后站在这一条线
if(col[y]==0&&dg[y-x+n]==0&&udg[x+y]==0){
a[x][y]='Q';
col[y]=dg[y-x+n]=udg[x+y]=1;
dfs(std+1);
a[x][y]='.';
col[y]=dg[y-x+n]=udg[x+y]=0;
}
}
return;
}
int main(){
cin >> n;
for (int i = 0; i < n; i ++ )
for (int j = 0; j < n; j ++ )
a[i][j] = '.';
dfs(0);
return 0;
}
八皇后题目精讲
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 21;
//设置三个数组用来判断横竖还有斜对线上是否有数
//col -> 列是否有数,diaW 正对角线是否有存放,diaS 斜对角线是否有存放
bool col[N],diaW[N],diaS[N];
//存放路径
int path[N];
int n;
//u代表的是竖着的y轴
//y轴上的数字代表的就是行数
bool dfs(int u){
//判断是否能找到
if(u==9){
if((--n)==0){
for(int i=1;i<=8;i++){
cout<<path[i];
}
cout<<endl;
return true;
}
return false;
}
//遍历循环,正对角线是 y = x + b, 副对角线是 y = -x + b。
//b=y-x,b=x+y。
//i代表的是横着的x轴
//x轴上的数字代表的就是列数
//即 a=b1b2…b8,其中 bu为相应摆法中第u行皇后所处的列数。
for(int i=1;i<=8;i++){
if(!col[i] && !diaW[i-u+8] && !diaS[i+u]){
col[i] = diaW[i-u+8] = diaS[i+u] = true;
path[u] = i;
if(dfs(u+1)) return true;
col[i] = diaW[i-u+8] = diaS[i+u] = false;
}
}
return false;
}
int main(){
int T;
cin>> T;
while(T--){
cin>>n;
memset(col,0,sizeof col);
memset(diaW,0,sizeof diaW);
memset(diaS,0,sizeof diaS);
dfs(1);
}
return 0;
}