算法设计-四后问题(C++)

一、问题简述

四皇后问题是一个经典的回溯算法问题,目标是在一个4x4的棋盘上放置4个皇后,使得它们互不攻击。皇后可以攻击同一行、同一列或同一对角线上的其他皇后。

二、详细代码

//
// Created by 24978 on 2024/11/27.
//
#include 
#include 
using namespace std;

// 检查当前列是否可以放置皇后
bool isSafe(const vector& board, int row, int col) {
    // 检查当前列是否有皇后
    for (int i = 0; i < row; ++i) {
        if (board[i] == col) {
            return false;
        }
    }

    // 检查左上对角线是否有皇后
    for (int i = row, j = col; i >= 0 && j >= 0; --i, --j) {
        if (board[i] == j) {
            return false;
        }
    }

    // 检查右上对角线是否有皇后
    for (int i = row, j = col; i >= 0 && j < 4; --i, ++j) {
        if (board[i] == j) {
            return false;
        }
    }

    return true;
}

// 打印当前的棋盘状态
void printBoard(const vector& board) {
    for (int i = 0; i < 4; ++i) {
        for (int j = 0; j < 4; ++j) {
            if (board[i] == j) {
                cout << "Q ";
            } else {
                cout << ". ";
            }
        }
        cout << endl;
    }
    cout << endl;
}

// 回溯算法解决四皇后问题
bool solveNQueens(vector& board, int row) {
    if (row == 4) {
        printBoard(board);
        return true;
    }

    bool res = false;
    for (int col = 0; col < 4; ++col) {
        if (isSafe(board, row, col)) {
            board[row] = col;

            res = solveNQueens(board, row + 1) || res;

            // 回溯
            board[row] = -1;
        }
    }

    return res;
}

int main() {
    vector board(4, -1); // 初始化棋盘,-1 表示当前位置没有皇后

    if (!solveNQueens(board, 0)) {
        cout << "No solution exists" << endl;
    }

    return 0;
}

三、代码结构

  1. isSafe函数:检查在当前行的某一列是否可以放置皇后。

  2. printBoard函数:打印当前棋盘的状态。

  3. solveNQueens函数:使用回溯算法递归地尝试放置皇后,并找到所有可能的解。

  4. main函数:初始化棋盘并调用求解函数。

四、isSafe

功能
  • 检查在棋盘的(row, col)位置放置皇后是否安全。

  • 需要检查以下三个条件:

    1. 当前列:检查当前列是否已经有皇后。

    2. 左上对角线:检查从(row, col)向左上方向的对角线是否已经有皇后。

    3. 右上对角线:检查从(row, col)向右上方向的对角线是否已经有皇后。

实现
  • 使用一个vector board表示棋盘,board[i]表示第i行皇后所在的列。

  • 如果发现冲突(即已经有皇后在同一列或对角线上),返回false;否则返回true

五、printBoard

功能
  • 打印当前棋盘的状态。

  • Q表示皇后的位置,用.表示空位。

实现
  • 遍历每一行和每一列,根据board[i]的值判断是否放置皇后,并打印相应的符号。

六、solveNQueens

功能
  • 使用回溯算法递归地尝试在每一行放置皇后。

  • 如果找到一个解,打印棋盘并继续寻找其他解。

实现
  1. 递归终止条件

    • 如果row == 4,表示所有行都已经成功放置皇后,打印当前棋盘并返回true

  2. 尝试放置皇后

    • 遍历当前行的每一列,检查是否可以放置皇后(调用isSafe函数)。

    • 如果可以放置,将皇后放在该位置(board[row] = col),并递归调用solveNQueens处理下一行。

  3. 回溯

    • 如果递归调用返回false,表示当前放置方式无解,需要撤销当前放置(board[row] = -1),并尝试其他列。

  4. 返回值

    • 返回res,表示是否找到至少一个解。

七、main

功能
  • 初始化棋盘并调用solveNQueens函数求解四皇后问题。

  • 如果没有找到解,输出No solution exists

实现
  • 使用一个大小为4的vector表示棋盘,初始值为-1,表示没有放置皇后。

  • 调用solveNQueens(board, 0)从第0行开始求解。

你可能感兴趣的:(c++,算法,开发语言)