低配版如下:

#include<bits/stdc++.h>
using namespace std;

// 游戏道具
bool colUsed[9] = {0};     // 记录列是否被占用(1-8列)
bool diag1[16] = {0};      // 记录左上到右下对角线是否被占用(共15条)
bool diag2[16] = {0};      // 记录右上到左下对角线是否被占用(共15条)
int solutionCount = 0;     // 记录找到的解法数量
int queenPos[9];           // 记录每行皇后的位置(第1-8行)

// 游戏角色
void placeQueen(int row);   // 放置皇后(负责在棋盘上放皇后)
void showSolution();        // 展示解法(显示找到的解法)

int main()
{
   placeQueen(1); // 从第1行开始放置皇后
   return 0;
}

/**
 * 放置皇后的函数
 * @param row 当前要放置皇后的行数(1-8)
 * 
 * 游戏规则:
 * 1. 每行放一个皇后
 * 2. 不能在同一列
 * 3. 不能在同一个对角线上
 * 
 * 工作方法:
 * 1. 尝试当前行的每个列位置(1-8列)
 * 2. 检查这个位置是否安全(列和两个对角线都没被占用)
 * 3. 如果安全:
 *    a. 放置皇后
 *    b. 标记列和对角线被占用
 *    c. 如果这是最后一行,展示解法
 *    d. 否则,继续放置下一行的皇后
 * 4. 回溯:拿回皇后,清除标记,尝试下一个位置
 */
void placeQueen(int row)
{
  int col;
  // 尝试当前行的每一列(1-8列)
  for (col=1; col<=8; col++) 
  {
    // 检查这个位置是否安全:
    // 1. 列没有被占用 (!colUsed[col])
    // 2. 左上到右下对角线没有被占用 (!diag1[row+col])
    // 3. 右上到左下对角线没有被占用 (!diag2[row-col+7]) 
    //    (+7是为了避免负数,将范围从-7到7变成0到14)
    if (colUsed[col] == 0 && diag1[row+col] == 0 && diag2[row-col+7] == 0) 
    {
      // 1. 在这个位置放置皇后
      queenPos[row] = col;
      
      // 2. 标记这个位置所在的列和对角线被占用
      colUsed[col] = 1;         // 标记列被占用
      diag1[row+col] = 1;       // 标记左上-右下对角线被占用
      diag2[row-col+7] = 1;     // 标记右上-左下对角线被占用
      
      // 3. 如果已经放满8行
      if (row == 8) {
        showSolution();          // 展示这个解法
      }
      // 4. 否则继续放置下一行的皇后
      else {
        placeQueen(row + 1);    // 递归放置下一行的皇后
      }
      
      // 5. 回溯:拿回皇后,清除标记(尝试其他位置)
      colUsed[col] = 0;         // 释放列
      diag1[row+col] = 0;       // 释放左上-右下对角线
      diag2[row-col+7] = 0;     // 释放右上-左下对角线
    }
  }
}

/**
 * 展示解法
 * 每找到一个解法就显示棋盘布局
 */
void showSolution()
{
    solutionCount++;             // 解法数量加1
    cout << "解法 #" << solutionCount << ":" << endl;
    
    // 显示每行皇后的位置
    for (int row = 1; row <= 8; row++) {
        cout << setw(3) << queenPos[row]; // 每列位置占3个字符宽度
    }
    cout << endl; 
}

高配版(矩阵显示)

#include<bits/stdc++.h>
#include<iomanip> // 用于格式化输出
using namespace std;

// 游戏道具
bool colUsed[9] = {0};     // 记录列是否被占用(1-8列)
bool diag1[16] = {0};      // 记录左上到右下对角线是否被占用(共15条)
bool diag2[16] = {0};      // 记录右上到左下对角线是否被占用(共15条)
int solutionCount = 0;     // 记录找到的解法数量
int queenPos[9];           // 记录每行皇后的位置(第1-8行)

// 游戏角色
void placeQueen(int row);   // 放置皇后(负责在棋盘上放皇后)
void showSolution();        // 展示解法(显示找到的解法)

int main()
{
   placeQueen(1); // 从第1行开始放置皇后
   return 0;
}

void placeQueen(int row)
{
  int col;
  for (col=1; col<=8; col++) 
  {
    if (colUsed[col] == 0 && diag1[row+col] == 0 && diag2[row-col+7] == 0) 
    {
      queenPos[row] = col;
      colUsed[col] = 1;
      diag1[row+col] = 1;
      diag2[row-col+7] = 1;
      
      if (row == 8) {
        showSolution();
      }
      else {
        placeQueen(row + 1);
      }
      
      colUsed[col] = 0;
      diag1[row+col] = 0;
      diag2[row-col+7] = 0;
    }
  }
}

/**
 * 修改后的展示函数:以8x8矩阵形式显示解法
 * 皇后位置显示为1,空白位置显示为0
 */
void showSolution()
{
    solutionCount++;
    cout << "解法 #" << solutionCount << ":\n";
    
    for (int row = 1; row <= 8; row++) {
        for (int col = 1; col <= 8; col++) {
            // 如果当前列是该行皇后的位置,输出1,否则输出0
            if (queenPos[row] == col) {
                cout << "* ";
            } else {
                cout << "_ ";
            }
        }
        cout << endl; // 每行结束后换行
    }
    cout << endl; // 解法之间添加空行分隔
}

超高配版(彩色)

#include<bits/stdc++.h>
using namespace std;

// 游戏道具
bool colUsed[9] = {0};     // 记录列是否被占用(1-8列)
bool diag1[16] = {0};      // 记录左上到右下对角线是否被占用(共15条)
bool diag2[16] = {0};      // 记录右上到左下对角线是否被占用(共15条)
int solutionCount = 0;     // 记录找到的解法数量
int queenPos[9];           // 记录每行皇后的位置(第1-8行)

// 游戏角色
void placeQueen(int row);   // 放置皇后(负责在棋盘上放皇后)
void showSolution();        // 展示解法(显示找到的解法)

int main()
{
   placeQueen(1); // 从第1行开始放置皇后
   return 0;
}

/**
 * 放置皇后的函数
 * @param row 当前要放置皇后的行数(1-8)
 * 
 * 规则说明:
 * 1. 每行只能放一个皇后
 * 2. 每列只能有一个皇后
 * 3. 每条对角线上只能有一个皇后
 * 
 * 工作方法:
 * 1. 尝试当前行的每个列位置
 * 2. 检查位置是否安全
 * 3. 放置皇后并标记位置
 * 4. 继续放置下一行
 * 5. 回溯尝试其他位置
 */
void placeQueen(int row)
{
  int col;
  // 尝试当前行的每一列(1-8列)
  for (col=1; col<=8; col++) 
  {
    // 检查位置是否安全:
    // 1. 列没被占用
    // 2. 左上到右下对角线没被占用
    // 3. 右上到左下对角线没被占用
    if (colUsed[col] == 0 && diag1[row+col] == 0 && diag2[row-col+7] == 0) 
    {
      // 1. 放置皇后
      queenPos[row] = col;
      
      // 2. 标记位置
      colUsed[col] = 1;         // 标记列
      diag1[row+col] = 1;       // 标记左上-右下对角线
      diag2[row-col+7] = 1;     // 标记右上-左下对角线
      
      // 3. 如果放满了8行
      if (row == 8) {
        showSolution();          // 显示解法
      }
      // 4. 继续放下一行
      else {
        placeQueen(row + 1);    // 递归放下一行
      }
      
      // 5. 回溯:清除标记尝试其他位置
      colUsed[col] = 0;         // 清除列标记
      diag1[row+col] = 0;       // 清除对角线标记
      diag2[row-col+7] = 0;     // 清除对角线标记
    }
  }
}

/**
 * 展示解法 - 以彩色棋盘形式显示
 * 特点:
 * 1. 使用皇后符号(?)代替星号
 * 2. 添加棋盘边框和坐标
 * 3. 使用不同颜色区分棋盘格
 * 4. 彩色显示解法编号
 */
void showSolution()
{
    solutionCount++; // 解法计数
    
    // 设置颜色:解法编号用紫色
    cout << "\033[1;35m"; // 紫色粗体
    cout << "════════════ 解法 #" << solutionCount << " ════════════\n";
    cout << "\033[0m"; // 重置颜色
    
    // 打印列坐标(A-H)
    cout << "   ";
    for (char c = 'A'; c <= 'H'; c++) {
        cout << " " << c << " "; // 列坐标用大写字母
    }
    cout << "\n";
    
    // 打印棋盘顶部边框
    cout << "  ╔";
    for (int i = 0; i < 8; i++) {
        cout << "═══";
        if (i < 7) cout << "╦";
    }
    cout << "╗\n";
    
    for (int row = 1; row <= 8; row++) {
        // 行号(1-8)
        cout << row << " ║";
        
        for (int col = 1; col <= 8; col++) {
            // 判断格子颜色:深色或浅色
            bool darkSquare = (row + col) % 2 == 0;
            
            if (queenPos[row] == col) {
                // 皇后位置:红色背景上的皇后符号
                if (darkSquare) {
                    cout << "\033[41;1;37m"; // 深色格子上的皇后:红底白字
                } else {
                    cout << "\033[41;1;37m"; // 浅色格子上的皇后:红底白字
                }
                cout << " Q ";
            } else {
                // 空格子:根据格子颜色设置背景
                if (darkSquare) {
                    cout << "\033[100m"; // 深灰色背景
                } else {
                    cout << "\033[47m"; // 浅灰色背景
                }
                cout << "   "; // 三个空格
            }
            cout << "\033[0m"; // 重置颜色
            cout << "║"; // 列分隔符
        }
        
        cout << "\n";
        
        // 行分隔符(最后一行不同)
        if (row < 8) {
            cout << "  ╠";
            for (int i = 0; i < 8; i++) {
                cout << "═══";
                if (i < 7) cout << "╬";
            }
            cout << "╣\n";
        }
    }
    
    // 打印棋盘底部边框
    cout << "  ╚";
    for (int i = 0; i < 8; i++) {
        cout << "═══";
        if (i < 7) cout << "╩";
    }
    cout << "╝\n\n";
}

0 条评论

目前还没有评论...