八皇后问题(附详细解释)

 

八皇后问题是经典的回溯的问题,好久之前就看到一种解法发现好难理解,和我自己想的完全不一样,然后就一直把其想得特别复杂,也是耽搁蛮久的一道题目,今天就要把它给终结。

        题目就是棋盘放棋子的问题,要保证互相之间不能相互攻击,所以,思想就是:假设棋盘的第一行的第一个就放棋子,然后判断是否符合,如果符合就在可以放的第二行的地方放第二个棋子,一直这样不断循环,直到所有可能的情况符合后退出就可以了。实现代码如下:(还没上算法课,所以语言可能不是很专业)

 

 

有问题可以提问,喜欢我的博客可以点赞,刚才看见有一个人喜欢,好开心啊~mua~

 
#include<bits/stdc++.h>
using namespace std;
int que[8],coun=0;
/*这个que数组就是存放放的位置,
比较巧妙的就是,下标代表所在的行,
所代表的值就是在那一行棋子所在的位置,
例如:que[4]=5,就是代表第四行(从0行开始)
棋子放在第五格(从0格开始)coun就是计数器,
代表所有可能的数*/
bool is_ok(int row){
    //判断放的位置是否符合不相互的攻击的函数 
    for(int i=0;i<row;i++){
        if(que[row]==que[i]||fabs(que[i]-que[row])==fabs(i-row))
         return false; 
         //que[row]==que[i]判断同一列是否放了多颗棋子 
        //fabs(que[i]-que[row])==fabs(i-row)这是一个公式的变形 
        //写成比较好理解的形式就是: 
        //que[i]+i==que[row]+row;判断斜右边是否有多颗棋子 
        //que[i]-i==que[row]-row;判断斜左边是否有多颗棋子 
    } 
    return true;
}
void queen(int row)
{ 
    if(row==8){ 
        coun++;//到了终点,计数器加一,退出 
        return ; 
    } 
    for(int i=0;i<8;i++){
        que[row]=i;//放棋子 
    if(is_ok(row))
        //判断可以后继续放下一颗 
        queen(row+1); 
    }
}
int main()
{ 
    queen(0);
    cout<<coun<<endl;
    return 0;
}

 

 

 

Emmmmmmm,不知道为什么代码一团糟了,改了下,抱歉 Q A Q……

N皇后问题也可以解决的,可以输出四个皇后问题的放置情况,只有两种可以试试,感觉倍儿成就感~~~

 

    原文作者:八皇后问题
    原文地址: https://blog.csdn.net/qq_41033913/article/details/80054878
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞