如何在8×8的国际象棋棋盘上安排8个皇后,使得没有两个皇后能互相进攻?如果两个皇后处在同一行、同一列或同-条对角线上,则它们能互相进攻。由此可推广到n皇后问题:有n个皇后和一个n×n棋盘,如何摆放能互相不进攻?

由于棋盘有行、列之分,本示例是按列坐标划分的。一个合适的列坐标排列是{1,5,8,6,3,7,2,4},因此转化为求集合X={1,2,3,4,5,6,7,8}中哪些排列的向量符合题中要求。满足要求的向量有两点:

  1. 不能同行同列。由于在向量X中没有重复元素,保证了不能同行、同列条件。
  2. 不能在对角线上。这一点需要函数判定,不难看出两个皇后处在同一条对角线上,当且仅当abs(X[i]一X[j])=abs(i-j)。

c++解决八皇后问题_算法

#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <math.h>
using namespace std;
bool ValidOrder(int* start, int* end) {
    int nSize = end - start;
    for (int i = 0; i < nSize - 1; i++) {
        for(int j = i + 1; j < nSize; j++){
            if(j - i == abs(*(start + i) - *(start + j))){
                return false;
            }
        }
    }
    return true;
}
int main() {
    int a[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
    do{
        if(ValidOrder(a, a + 8)){
            copy(a, a + 8, ostream_iterator<int>(cout, " "));
            cout<< endl;
        }
    }while(next_permutation(a, a + 8));
    return 0;
}

c++解决八皇后问题_算法_02