- 吐吐很快乐
八皇后问题代码小学生版
- 2025-6-1 15:20:55 @
低配版如下:
#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 条评论
目前还没有评论...