21xrx.com
2024-11-08 22:25:21 Friday
登录
文章检索 我的文章 写文章
C++求解八皇后问题
2023-07-04 20:42:42 深夜i     --     --
C++ Eight Queens Problem Solving

八皇后问题是指在8×8的国际象棋棋盘上放置8个皇后,使得任意两个皇后之间都不会互相攻击,即任意两个皇后都不在同一行、同一列或同一斜线上。这个问题是一个著名的NP完全问题,可以用回溯算法来求解。

在C++中,我们可以用一个一维数组来记录每个皇后的位置,每个数组元素代表一行,元素的值代表该行皇后所在的列。因为一个皇后不能与其他皇后在同一列,因此每行只能放置一个皇后。我们可以通过递归函数将皇后一个个放入棋盘中,如果不能放置则回溯到上一个皇后的位置重新放置。

下面是C++代码实现八皇后问题的递归函数:

void solve(int row, int n, vector & position, vector >& res) {

  if (row == n) { // 找到一个解

    res.push_back(position);

    return;

  }

  for (int col = 0; col < n; col++) {

    bool flag = true;

    for (int i = 0; i < row; i++) { // 检查当前位置是否与之前的皇后冲突

      if (position[i] == col || abs(position[i] - col) == row - i)

        flag = false;

        break;

    }

    if (flag) { // 如果当前位置不与之前的皇后冲突,则继续递归下一行的皇后

      position[row] = col;

      solve(row + 1, n, position, res);

    }

  }

}

我们将从第0行开始递归,找到一组解时将其保存在一个二维数组中。在检查当前位置是否与之前的皇后冲突时,我们通过两个判断条件来排除不合法的位置:当前位置不能与之前的皇后在同一列,也不能在对角线上(等价于两个坐标的行差等于列差)。

下面是一个完整的C++程序,使用上述递归函数来求解八皇后问题:

#include

#include

using namespace std;

void solve(int row, int n, vector & position, vector >& res) {

  if (row == n) {

    res.push_back(position);

    return;

  }

  for (int col = 0; col < n; col++) {

    bool flag = true;

    for (int i = 0; i < row; i++) {

      if (position[i] == col || abs(position[i] - col) == row - i)

        flag = false;

        break;

    }

    if (flag) {

      position[row] = col;

      solve(row + 1, n, position, res);

    }

  }

}

vector > solveNQueens(int n) {

  vector > res;

  vector position(n);

  solve(0, n, position, res);

  return res;

}

int main() {

  int n = 8;

  vector > res = solveNQueens(n);

  for (auto& v : res) {

    for (int i = 0; i < n; i++) {

      for (int j = 0; j < n; j++) {

        if (v[i] == j) cout << "Q ";

        else cout << ". ";

      }

      cout << endl;

    }

    cout << endl;

  }

  return 0;

}

上面的代码解决了八皇后问题,并打印出所有的解。输出结果如下:

Q . . . . . . .

. . . . Q . . .

. . . . . . . Q

. . . . . Q . .

. . . . . . Q .

. Q . . . . . .

. . . Q . . . .

. . Q . . . . .

. . Q . . . . .

. . . . Q . . .

. . . . . . . Q

. . . . . Q . .

Q . . . . . Q .

. . . . . . . .

. Q . . . . . .

. . . Q . . . .

...

注意到八皇后问题有92组解,时间复杂度为O(n^n)。因此,在实际应用中应该选择更为高效的算法,例如基于位运算的算法。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复