问题描述:

在N×N格的棋盘上放置彼此不受攻击的N个皇后,按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子,求解可以放置的布局方式。

设计要求:

(1) 要求实现图形化棋盘显示;

(2) 要求实现N皇后布局演示,可以使用方向键进行布局切换。

问题分析:

当n的个数比较小时,我们可以采用穷举法来列举可能出现的情况,但当n的个数比较大时,就需要考虑其他的方法了。在n*n的棋盘上,每个皇后可能有n个摆放位置,有两种方法可以来进行判断:

1.最后一个皇后已经放到棋盘,此时在进行判断是否满足条件。

2.每放一个皇后就进行判断,当不满足条件时,后面的情况就不用再考虑了,直接看下一个摆放的位置。

如下图:

因此我们就可以得到解题思路,每放一个皇后就与上一个进行判断,判断该位置是否与前面的皇后发生冲突。

算法实现:

#include<cmath>
using namespace std;
int n,tol=0; // N皇后个数和成功个数
int queen[100] = {0}; //[]里的值代表行数,value值代表列数
int col[1000][100] = {0}; //用来存放成功的数据
bool check(int r,int c){ // (r,c)代表新皇后的坐标
for(int i=0;i<r;i++){
if(queen[i]==c||(abs(queen[i]-c) == abs(r-i))){ // 判断是否冲突(第一个判断的是行数等于列数,即对角线)
return false;
}
}
return true;
}
void DFS(int r){
if(r==n){ //判断最后一个是否已经放到棋盘,最后一个放到棋盘,说明是一种解法
for(int i=0;i<n;i++){
col[tol][i] = queen[i]; //讲棋盘存到总的期盼里
}
tol++; //成功次数++
//queen[100]={}; //初始临时棋盘
return;
} for(int c=0;c<n;c++){
if(check(r,c)){ //判断该位置是否与前n-1个位置冲突
queen[r] = c; //不冲突赋值
DFS(r+1); //进行一下行操作
}
}
}
void show(int r){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(col[r][i]==j){//col[r][i]有保存的值,和j做比较
cout<<"Q ";
}else{
cout<<"X ";
}
}
cout<<endl<<endl;
}
cout<<"************当前页数"<<r+1<<"************"<<endl<<endl;
cout<<"*********->查看下一个,<-查看上一个*********"<<endl;
}
int main(){
cout<<"请输入皇后的数量:";
cin>>n;
if(n<3){
cout<<"无解!"<<endl;
return 0;
}
DFS(0);
cout<<"一共有"<<tol<<"种布局"<<endl<<endl;
int ch1=0;
int ch2=0;
int current = 0;
show(current);
//实现左右翻页
while (1){ //无限循环
//使用getch()读取方向键,读取方向键需要读取两次
if (ch1=getch()){
ch2=getch();//第一次调用getch(),返回值224
switch (ch2){//第二次调用getch()
case 75: { //←的ascll
if(current-1>=0){
current--;
}else{
current = tol-1;
}
system("cls\n");
cout<<"请输入皇后的数量:"<<n<<endl;
cout<<"一共有"<<tol<<"种布局"<<endl<<endl;
show(current);
break;
}
case 77: {
if(current+1<=tol-1){
current++;
}else{
current = 0;
}
system("cls\n");
cout<<"请输入皇后的数量:"<<n<<endl;
cout<<"一共有"<<tol<<"种布局"<<endl<<endl;
show(current); break;
}
default:cout<<"输入错误!"<<endl;break; }
}
}
return 0;
}

代码说明:

采用数组来存放结果,方向键的切换是采用读取getch来实现的。在函数check()中,判断冲突的条件是通过循环遍历来检验刚刚放进的第r行皇后是否与前r-1行放的发生冲突,即行数相等或列数相等。

资料参考:

n皇后详解及代码实现/C++ - Geek_Ling - 博客园 (cnblogs.com)

https://www.cnblogs.com/yangxiao-/p/13683675.html

N皇后演示程序的更多相关文章

  1. 递归实现n(经典的8皇后问题)皇后的问题

    问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上 ...

  2. 八皇后算法的另一种实现(c#版本)

    八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...

  3. [LeetCode] N-Queens II N皇后问题之二

    Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...

  4. [LeetCode] N-Queens N皇后问题

    The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...

  5. N皇后问题—初级回溯

    N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...

  6. 数据结构0103汉诺塔&八皇后

    主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...

  7. N皇后问题

    题目描述 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于再n×n的棋盘上放置n个后,任何2个皇后不妨在同一行或同 ...

  8. LeetCode:N-Queens I II(n皇后问题)

    N-Queens The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no tw ...

  9. 八皇后问题_Qt_界面程序实现

    //核心代码如下 //Queen--放置皇后 #include "queue.h" queue::queue() { *; ; this->board = new bool[ ...

随机推荐

  1. 【LeetCode】39. 组合总和

    39. 组合总和 知识点:递归:回溯:组合:剪枝 题目描述 给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数  ...

  2. JavaGUI画笔工具的使用

    JavaGUI画笔工具的使用 package GUI; import java.awt.*; public class TestPaint { public static void main(Stri ...

  3. PaddlePaddle之猫狗大战(本地数据集)

    新手入门PaddlePaddle的一个简单Demo--猫狗大战 主要目的在于整体了解PP用卷积做图像分类的流程,以及最最重要的掌握自定义数据集的读取方式 猫狗数据集是从网络上下载到工作目录的. 本项目 ...

  4. Woc,考场(面试)忘记打平衡树怎么办,Trie救你命

    Woc,考场(面试)忘记打平衡树怎么办,Trie救你命 文本只发布于博客园,其他地方出现本文均是未经许可的盗版. 算法导入 众所周知平衡树很难打(大佬除外),还老是调错.万一这种事情发生在关键时刻你就 ...

  5. 一次关于shiro反序列化漏洞的思考

    0x01前言 之前在我反序列化的那篇文章中(https://www.cnblogs.com/lcxblogs/p/13539535.html),简单说了一下反序列化漏洞,也提了一嘴常见的几种Java框 ...

  6. ☕【Java技术指南】「编译器专题」重塑认识Java编译器的执行过程(常量优化机制)!

    问题概括 静态常量可以再编译器确定字面量,但常量并不一定在编译期就确定了, 也可以在运行时确定,所以Java针对某些情况制定了常量优化机制. 常量优化机制 给一个变量赋值,如果等于号的右边是常量的表达 ...

  7. SQL 练习20

    查询各科成绩前三名的记录 select a.sid,a.cid,a.score from sc a left join sc b on a.cid = b.cid and a.score<b.s ...

  8. noip15

    童话故事专场 T1 首先,dead line 是一条直线,而不是线段.考试的时候一直以为是线段,那么横竖共有n+m条,考虑斜着的,斜着的交点为有穷的,则需要满足斜率不同,那么只需要统计一边的,再乘2就 ...

  9. NOIP 模拟 6 辣鸡

    题解 难得啊,本来能 \(AC\) 的一道题,注释没删,挂了五分,难受 此题暴力很好想,就是直接 \(n^2\) 枚举不同的矩阵组合,记录块内答案和跨块的答案 出题人不会告诉你,这题只要输出块内答案就 ...

  10. vue同一个页面可以有多个router-view

    参考:https://blog.csdn.net/u011615787/article/details/80075240 参考:https://router.vuejs.org/zh/guide/es ...