【洛谷 P1219】八皇后

八皇后(题目链接)

思路

  • 典型的深搜回溯问题

代码

#include <iostream>
using namespace std;

struct Point{
    int x;
    int y;
};

int N = 0;          //要放的皇后的个数 
int num = 0;        //保存已经放下的皇后的数量 
int ans = 0;        //保存已经找到的答案种数 
Point q[14];        //保存已经放下的皇后的位置

//判断该位置能不能放皇后 
int check(int x, int y){
    //遍历已经放下的每一个皇后,计算是否冲突 
    for(int i = 1; i <= num; i++){
        //与第i个皇后同行的 
        if(x == q[i].x){
            return 0;
        }
        //与第i个皇后同列的 
        if(y == q[i].y){
            return 0;
        }
        //与第i个皇后同斜线的    
        if(x + y == q[i].x + q[i].y){
            return 0;
        }
        //与第i个皇后同反斜线的 
        if(x - y == q[i].x - q[i].y){
            return 0;
        }
    }
    return 1;   
}

void dfs(int x){
    //如果已经考虑完每一行 
    if(x > N){
        //并且已经放下了N个皇后 
        if(num == N){
            ans++;
            //输出前三种解 
            if(ans <= 3){
                for(int i = 1; i <= N; i++){
                    cout << q[i].y << " ";
                }
                cout << endl;
            }
        }
        return;
    }
    //遍历每一行的每一个位置 
    for(int y = 1; y <= N; y++){
        //如果能够放下皇后 
        if(check(x,y) == 1){
            //已经放下的皇后数增加1 
            num++;
            //记下刚刚放下皇后的位置 
            q[num].x = x;
            q[num].y = y;
            //搜索下一行 
            dfs(x+1);
            //把放下的皇后的数目减1
            //相当于拿起当前位置的皇后,继续考虑该行的下一个位置 
            num--;
        }
    }
}


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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,481评论 25 708
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,970评论 2 59
  • 2018.4.25 第17天 读一遍规划已读 每天一句爱的表达:对彬彬说爱你,对帮助我的人说谢谢 每天一次自我确认...
    双小宝阅读 129评论 0 0
  • 最简单好记的实现方法居然才一行代码而已 相关知识点:JavaScript split方法 split() 方法用于...
    校长不读书阅读 5,364评论 0 0
  • 今天晚上一个朋友打电话跟我抱怨,说她今天遇到了几个职场问题非常棘手,不知道应该怎么处理。我听了以后深有感触,因为我...
    allenXX阅读 350评论 0 0