八皇后问题(dfs,回溯)

问题地址:

https://www.luogu.com.cn/problem/P1219

解析:

1.每个皇后所在的行、列、两条对角线都不能有别的皇后
2.因为要判断出所有的可能,所以要采用深度优先搜索,结束了一种后再搜索同一层的其他情况
3.设置四个数组,a[13],b[13],c[13],d[13],初始化都为0
a用来储存i行的列值,例如,a[1]=2,第一行的皇后放在2列上
b用来标记j列,例如,b[2]=1,第2列已经有皇后占领
c用来标记左下到右上的对角线,c[i+j]代表的是同一条线
d用来标记左上到右下的对角线,d[i-j+n]代表的是同一条线


上对角线

下对角线

代码

#include<bits/stdc++.h>
using namespace std;
int a[14],b[14],c[28],d[28];
int cnt;//放置方式计数
int n;
void print(){
    if(cnt<=2){//如果超过3个就停止输出,只进行cnt++
        for(int k=1;k<=n;k++){
            cout<<a[k]<<" ";
        }
        cout<<endl;
    }
    cnt++;
}
void queen(int i){
    if(i>n){//如果走完全部的n行,dfs到底了
        print();
        return;
    }else{
        for(int j=1;j<=n;j++){
            if((!b[j])&&(!c[i+j])&&(!d[i-j+n])){
//如果列、上下对角线都没被标记
                a[i]=j;//储存列的值
                b[j]=1;//标记
                c[i+j]=1;
                d[i-j+n]=1;
                queen(i+1);//进行下一层
                b[j]=0;
                c[i+j]=0;
                d[i-j+n]=0; //回到上一步要清除标记,相当于没有标记过(不能影响右侧的搜索)
            }
        }
    }
}
int main(){
    cin>>n;
    queen(1);//第一个皇后的位置
    cout<<cnt;
    return 0;
} 

总结:
本题最主要的就是如何标记,

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 12,947评论 0 13
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 8,771评论 0 2
  • 回溯算法 回溯法:也称为试探法,它并不考虑问题规模的大小,而是从问题的最明显的最小规模开始逐步求解出可能的答案,并...
    fredal阅读 14,681评论 0 89
  • 1. 关于诊断X线机准直器的作用,错误的是()。 (6.0 分) A. 显示照射野 B. 显示中心线 C. 屏蔽多...
    我们村我最帅阅读 13,718评论 0 5
  • 夜已深,外边应是寒风凛冽,寒冬当是这样吧! 今日因为我的原因,又让你不开心了……浓郁的情绪扑面而来,我内心后悔不已...
    乔花乔花阅读 1,677评论 0 0