八皇后问题-回溯算法

来源:互联网 发布:全国电视台直播软件 编辑:程序博客网 时间:2024/05/22 09:06

八皇后问题
(1)逐行放置,检测位置是否合法只需要检测是否同列,是否同对角线,是否同反对角线;
(2)采用一维数组保存皇后位置(record[i]的含义为第i行皇后所处位置为record[i]);
(3)对角线的斜率是1,反对角线的斜率为-1,若两个皇后的位置为(xi,yi)(xj,yj),则只需要|xi-xj| != |yi-yj| 且 yi != yj,位置便是合法的;

#include <iostream>#include <cmath>using namespace std;int counter = 0;int N = 8;int record[8];//第i行的第record[i]列放置了一个皇后void func(int curRow){    if (curRow == N)        counter++;    else     for (int i = 0; i < N;i++)    {        bool isOk = true;        record[curRow] = i;//尝试将第cur行的皇后放在第i列        for (int j = 0; j < curRow; j++)//        {            if (record[curRow] == record[j] ||                abs(curRow - j) == abs(record[curRow] - record[j]))            {                isOk = false;                break;            }               }        if (isOk)//如果放置合法 那么进行下一行的放置            func(curRow + 1);    }}int main(){    func(0);    cout << counter << endl;    return 0;}

欢迎大家批评指正~

0 0