八皇后问题并输出棋盘(回溯法)

2024-04-28 03:08

本文主要是介绍八皇后问题并输出棋盘(回溯法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

八皇后问题并输出棋盘

题目:

在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
并将答案按照国际象棋棋盘样式输出

解题思路:

1.求解决方案
输入:皇后的个数 n
输出:n 皇后的解的棋盘
初始化解向量 x[n]=-1
解:

1K=1
2、While(k>=1)3、把皇后摆放在下一列的位置,x[k]++4、从 x[k]开始依次考察下一列,如果皇后 k 摆放在 x[k]位置不发生冲突,转 5,否则 x[k]++试探下一列5、若 n 个皇后都已全部摆放,则输出一个解,算法结束;6、若尚有皇后没摆放,k++,转步骤 5 转下一个皇后7、若 x[k]出界,回溯,x[k]=-1,k--,转步骤 3 重新摆放皇后 k8、退出循环,说明 n 皇后问题无解

2.输出棋盘
从国际象棋棋盘可以看出,黑格和白格交替分布,相邻两行分布错位,所以按照这个规律,写出如下函数:

void printChess(int *a) {for (int i = 0; i < N; ++i) { //遍历每一行for (int j = 0; j < N; ++j) { //遍历每一列if (i%2==0 && j%2==0)cout << (a[i] == j ? "K" : "+");else if (i%2==1 && j%2==0)cout << (a[i]== j ? "`" : ">");else if (i%2==0 && j%2==1)cout << (a[i] == j ? "`" : ">");else if (i%2==1 && j%2==1)cout << (a[i] == j ? "K" : "+");} //如果标记数组中这一行的皇后放在j位置,则输出X,否则输出-,cout << endl; //每一行输出一个换行}cout << endl;
}

这里用的字体是Chess Adventure,用户需要自行下载并安装到自己的电脑中,链接如下:http://www.fontsaddict.com/font/chess-adventurer.html
如果无法下载请私信我。

其中‘K’,‘+’,‘`’,‘>’代表着白底皇后,白格,黑底皇后,黑格,当然也可以选择其他符号

源代码

#include<iostream>
#include <math.h>  
using namespace std;          
const int N = 8;                       
int x[N] = {-1};               //将数组x[N]初始化为-1int Place(int k)                    //考察皇后k放置在x[k]列是否发生冲突
{for (int i = 0; i < k; i++)   if (x[i] == x[k] || abs(i - k) == abs( x[i] - x[k]))  //冲突,返回1return 1;                                          return 0;                                            //不冲突,返回0
}void printChess(int *a) {for (int i = 0; i < N; ++i) { //遍历每一行for (int j = 0; j < N; ++j) { //遍历每一列if (i%2==0 && j%2==0)cout << (a[i] == j ? "K" : "+");else if (i%2==1 && j%2==0)cout << (a[i]== j ? "`" : ">");else if (i%2==0 && j%2==1)cout << (a[i] == j ? "`" : ">");else if (i%2==1 && j%2==1)cout << (a[i] == j ? "K" : "+");} //如果标记数组中这一行的皇后放在j位置,则输出X,否则输出-,cout << endl; //每一行输出一个换行}cout << endl;
}void Queue(int n)                      
{int k = 0;  int solution=0;                         while (k >= 0)                               //摆放皇后{x[k]++;                                       //在下一列摆放皇后kwhile (x[k] < n && Place(k) == 1)                           //发生冲突x[k]++;                                       //皇后k试探下一列if (x[k] < n && k == n - 1 )                         //得到一个解,输出{cout<<"Solutions:"<<solution+1<<endl;printChess(x);solution++;x[k--] = -1;                  //重置x[k],回溯,重新摆放皇后k}else if (x[k] < n && k < n - 1)                         //尚有皇后未摆放k = k + 1;                               //准备摆放下一个皇后elsex[k--] = -1;                  //重置x[k],回溯,重新摆放皇后k}cout<<"Solutions="<<solution<<endl;cout<<"end"<<endl;
}int main( )
{Queue(8);         return 0;                      
}

结果

1.输出的文本(部分):
在这里插入图片描述
2.将其复制到Word中修改字体(部分)
在这里插入图片描述

这篇关于八皇后问题并输出棋盘(回溯法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/942186

相关文章

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

kkFileView启动报错:报错2003端口占用的问题及解决

《kkFileView启动报错:报错2003端口占用的问题及解决》kkFileView启动报错因office组件2003端口未关闭,解决:查杀占用端口的进程,终止Java进程,使用shutdown.s... 目录原因解决总结kkFileViewjavascript启动报错启动office组件失败,请检查of

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Python错误AttributeError: 'NoneType' object has no attribute问题的彻底解决方法

《Python错误AttributeError:NoneTypeobjecthasnoattribute问题的彻底解决方法》在Python项目开发和调试过程中,经常会碰到这样一个异常信息... 目录问题背景与概述错误解读:AttributeError: 'NoneType' object has no at

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red