美文网首页
搜索与回溯系列十四 八皇后问题

搜索与回溯系列十四 八皇后问题

作者: 徐慵仙 | 来源:发表于2020-02-17 18:29 被阅读0次

题目

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

简析

经典的八皇后问题,国际象棋里的皇后比较NB,即能直着走,也能斜着走。皇上只能走一步。可能东西文化差异吧,中国象棋就没皇后,可能后宫佳丽太多,不知道上哪个好。
这么厉害的皇后,一个八成八棋盘能不能容下八个共存呢?这就是八皇后问题。
解法有很多,用二维数组模拟一个期盼,我们采用一行一行放,即在第一行找个地方放一个,然后搜索第二行看能不能找到放的地方,直到在第八行找到地方为止。

1 for循环范围

对于第K层,就是第K行,我们从第一列一直尝试放到第八列,那范围就是1~8即可。

    for(int i=1;i<=8;i++){

2 判断可选

判断一个点能不能放,有四种情况

  • A 左边
  • B 上边
  • C 左上
  • D 右上
    这块是这种解法中的重难点部分,大家自己画一下就懂了。为什么下边、左下,右下都不用判断呢?
bool pd(int x,int y){
    for(int l=y-1;l>=1;l--){//这一行往前
        if(vis[x][l]==1) return false;
    }
    for(int h=x-1;h>=1;h--){//往上
        if(vis[h][y]==1) return false;
    }
    for(int h=x-1,l=y-1;h>=1&&l>=1;h--,l--){//左上
        if(vis[h][l]==1) return false;
    }
    for(int h=x-1,l=y+1;h>=1&&l<=8;h--,l++){//右上
        if(vis[h][l]==1) return false;
    }
    return true;
}

3 选中、结束条件、递归方法

  • 选中后,这个点标为1即可
  • 结束条件:如果选完了,k=8,说明第八行也找到了,打印就行了。
  • 递归方法:没到第八行,搜索下一层
  • 回溯:把这个点重新设为0

代码

#include <iostream>
using namespace std;
int vis[9][9]={0};
int total=0;
bool pd(int,int);
void print(){
    total++;
    for(int i=1;i<=8;i++){
        for(int j=1;j<=8;j++){
            if(vis[i][j]==0) cout<<"O ";
            else cout<<"X ";
        }
        cout<<endl;
    }
    cout<<endl;
}
void search(int k){
    for(int i=1;i<=8;i++){
        if(pd(k,i)){
            vis[k][i]=1;
            if(k==8) print();
            search(k+1);
            vis[k][i]=0;
        }
    }
}
bool pd(int x,int y){
    for(int l=y-1;l>=1;l--){//这一行往前
        if(vis[x][l]==1) return false;
    }
    for(int h=x-1;h>=1;h--){//往上
        if(vis[h][y]==1) return false;
    }
    for(int h=x-1,l=y-1;h>=1&&l>=1;h--,l--){//左上
        if(vis[h][l]==1) return false;
    }
    for(int h=x-1,l=y+1;h>=1&&l<=8;h--,l++){//右上
        if(vis[h][l]==1) return false;
    }
    return true;
}
int main(){
    search(1);
    cout<<total;
}

相关文章

  • 搜索与回溯系列十四 八皇后问题

    题目 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提...

  • 八皇后问题回溯法和迭代法

    数据结构系列文章: 常用的排序 二叉树的4种遍历 八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型...

  • LeetCode 51. N-Queens

    Leetcode : N-QueensDiffculty:Hard N皇后问题,对八皇后问题的扩展,典型的回溯法算...

  • 【洛谷 P1219】八皇后

    八皇后(题目链接) 思路 典型的深搜回溯问题 代码

  • 八皇后问题c语言算法

    目录[TOC] 问题分析: 相信八皇后规则的问题,大家都很熟悉,接下来是如何分析回溯法的应用。回溯法与图里面的深度...

  • 皇后问题

    经常做算法赛题的朋友们都知道,八皇后问题是一道经典的搜索回溯题。简单来说,皇后问题就是在一个国际象棋棋盘上摆放若干...

  • 回溯算法 八皇后问题

    参考小白带你学--回溯算法[https://zhuanlan.zhihu.com/p/54275352]LeetC...

  • 回溯法 八皇后问题

    问题描述 要在8*8的国际象棋中放八个皇后,使任意两个皇后不能相互吃掉,在同一行,同一列,同一对角线会相互吃掉,求...

  • 回溯算法--八皇后问题

    8x8 的棋盘,8 个棋子(皇后),每个棋子所在的行、列、对角线都不能有另一个棋子

  • 回溯算法:八皇后问题

    调用执行:

网友评论

      本文标题:搜索与回溯系列十四 八皇后问题

      本文链接:https://www.haomeiwen.com/subject/oakifhtx.html