使用STL解决八皇后问题

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
 
using namespace std;
const int MAX = 8;
 
vector<int> board(MAX);
 
void show_result()
{
    for(size_t i = 0;i < board.size();++i) {
        cout << "(" << i << "," << board[i] << ")";
    }
    cout << endl;
}
 
int check_cross()
{
    //核心就是检测有没有交叉
    //等于是board存储的是行或者列的一个坐标排列
    //等于生成各种8个棋子的坐标排列进行判断
    //这里i和j都是不同的
    //首先board的排列不会出现同一行同一个列的情况
    //然后是i和j不会出现相同的情况
    //这样就避免去判断两个棋子是不是排列到同一行或者
    //同一列的情况
    for(size_t i = 0;i < board.size() - 1;++i) {
        for(size_t j = i + 1;j < board.size();j++) {
            if((j - i) == (size_t)abs(board[i] - board[j])) {
                return 1;
            }
        }
    }
    return 0;
}
 
void put_chess()
{
    while(next_permutation(board.begin(),board.end())) {
        if(!check_cross()) {
            show_result();
        }
    }
}
 
int
main(int argc,char *argv[])
{
    for(size_t i = 0;i < board.size();++i) {
        board[i] = i;
    }
    put_chess();
    return 0;
}

程序解释:

1.使用一个8位向量来表示期盼,向量的值代表列数,向量的下标代表行数,所以,8位向量存的是0~7,且值互不相同,列数也互不相同,所以,这样表示就直接排除了相同列和相同行的情况,问题简化为只需判别是否是属于相同对角线的情况。

2.put_chess()来判别棋子是否在一个对角线

3.next_permutation() 求解向量的全排列,对该全排列来判断是否在同一对角线

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