数据结构学习之栈求解n皇后问题

0x1 目的

​ 深入掌握栈应用的算法和设计

0x2 内容

​ 编写一个程序exp3-8.cpp求解n皇后问题。

0x3 问题描述

即在n×n的方格棋盘上,放置n个皇后,要求每个皇后不同行、不同列、不同左右对角线。

要求:(1)皇后的个数n由用户输入,其值不能超过20,输出所有的解。(2)采用类似于栈求解迷宫问题的方法。

0x4 代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>
#define MaxSize 100000+7
#define maxsize 20+7
using namespace std;int path[maxsize][maxsize];
int n;int y_pos[maxsize];
int count=0;
bool judge(int num)
{for(int i=0;i<num;i++){if(y_pos[i]==y_pos[num] || abs(y_pos[num]-y_pos[i])==num-i)return false;}return true;
}
typedef struct
{int x;int y;int di;
}Box;typedef struct
{Box data[MaxSize];int top;
}StType;void InitStack(StType *&s)
{s=(StType *)malloc(sizeof(StType));s->top=-1;
}void DestroyStack(StType *&s)
{free(s);
}bool GetTop(StType *&s,Box &e)
{if(s->top==-1)return false;e=s->data[s->top];return true;
}bool push(StType *&s,Box e)
{if(s->top==MaxSize-1)return false;s->top++;s->data[s->top]=e;return true;
}bool pop(StType *&s,Box &e)
{if(s->top==-1)return false;e=s->data[s->top];s->top--;return true;
}int GetLength(StType *s)
{return(s->top+1);
}bool EmptyStack(StType *s)
{return(s->top==-1);
}void SetPath(int ex,int ey,int k)
{int xi=ex;int yi=ey;for(int i=0;i<n;i++){path[xi][i]+=k;path[i][yi]+=k;}int x1,x2,y1,y2;x1=x2=xi;y1=y2=yi;while(x1>0&&y1>0)path[--x1][--y1]+=k;while(x2<n&&y2<n)path[x2++][y2++]+=k;path[xi][yi]-=k*2;
}void printSolution()
{for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(y_pos[i]==j)printf("q");elseprintf("*");}printf("\n");}printf("\n");
}void Disp(StType *s)
{for(int i=0;i<s->top;i++)printf("\t(%d,%d)",s->data[i].x,s->data[i].y);
}void SolveQ(int n)
{int x1,y1,di;StType *st;InitStack(st);Box e;e.x=0;e.y=-1;push(st,e);while(!EmptyStack(st)){GetTop(st,e);x1=e.x;y1=e.y;bool find=false;if(x1==n){printSolution();Disp(st);printf("\n");count++;}while(y1<n-1 && !find){y1++;y_pos[x1]=y1;st->data[st->top].y=y1;if(judge(x1)){find=true;e.x=x1+1;e.y=-1;push(st,e);}}if(!find){pop(st,e);}//pop(st,e);}
}int main()
{printf("please input n:\n");scanf("%d",&n);memset(path,0,sizeof(path));memset(y_pos,0,sizeof(y_pos));SolveQ(n);printf("\n count:%d \n",count);return 0;
}

0x5 结果

0x6 总结

​ 当时我在写的时候很纠结从0开始的问题,思想肯定是这样子的,先遍历每一行的每一列,然后在回溯。那么就需要做好回溯的标志e.x记录当前在第几行,方便下次回溯到e.x-1,这里唯一需要注意的是判断打印条件,if(x1==n),一开始我以为既然已经让第七行进栈了,那么说明满足,但是后面我理解错了,程序的逻辑是下一行进栈开始的时候y1=-1的,也就是我们要去到第8行才能知道第7行的结果是可以的。

转载于:https://www.cnblogs.com/xq17dog/p/10694116.html

数据结构学习之栈求解n皇后问题相关推荐

  1. Python数据结构学习笔记——栈

    目录 一.栈的定义和特性 (一)栈的定义 (二)栈的反转特性 二.实现分析步骤 三.栈的Python实现代码 四.栈的应用 (一)匹配圆括号 (二)匹配符号 (三)模2除法(十进制转二进制) (四)进 ...

  2. 数据结构学习笔记——栈(1)定义理解

    写在前面的话--努力不晚 博主是某985学校数字媒体技术专业的本科在读生,即将成为大四狗,今后打算国内读研. 因为数媒专业设置的缘故,前两年尝试了很多艺术和设计方面的东西:素描.设计原理.UI.视频剪 ...

  3. 数据结构学习笔记——栈和队列

    4 栈与队列   栈是限定仅在表尾进行插入和删除操作的线性表.队列是只允许在一端进行插入操作.而在另一端进行删除操作的线性表. 4.1 栈的定义 栈(stack)是限定仅在表尾进行插入和删除操作的线性 ...

  4. 数据结构学习笔记——栈的基本知识和顺序存储结构实现栈(顺序栈)

    目录 一.栈 (一)栈的概念 (二)栈的排列 (三)共享栈 (四)栈的常见应用 二.顺序栈的定义 三.顺序栈的初始化 四.判断顺序栈是否为空栈 五.判断顺序栈是否为满栈 六.进栈(插入操作) 七.出栈 ...

  5. java栈和队列实现删除,数据结构学习--Java栈和队列

    栈:先进后出 队列:先进先出 都是数组存放,但是删除的时候不是删除了数组中的数据,而是使用增加游标标识的方式实现删除,"游标标识"加加或者减减完成删除操作,查看的时候,也不是直接查 ...

  6. 408数据结构学习笔记——栈和队列的应用、特殊矩阵的压缩

    目录 1.栈在括号匹配中的应用​ 2.栈在表达式求值中的运用 2.1.中缀表达式转换后缀表达式 2.2.后缀表达式的计算方法 2.3.中缀表达式转换前缀表达式 2.4. 中缀表达式转后缀表达式(机算- ...

  7. Python数据结构学习笔记——队列和双端队列

    目录 一.队列的定义 二.队列 实现步骤分析 三.队列的Python实现代码 四.队列的应用 六人传土豆游戏 五.双端队列的定义 六.双端队列 实现步骤分析 七.双端队列的Python实现代码 八.双 ...

  8. 栈和队列求解迷宫问题(数据结构学习笔记)

    文章目录 迷宫问题 "栈"求解迷宫问题 行走规则 算法思路 算法代码 栈的定义 算法设计 完整代码 最终迷宫路径 算法总结 "队列"求解迷宫问题 算法思路 算法 ...

  9. C++ 数据结构学习 ---- 栈及其应用

    目录 1.头文件 1.1 Stack.h 1.2主文件头文件 2.栈的应用 2.1 进制转换器 2.2 进制转换器运行截图 2.3 括号匹配玉逆波兰表达式 2.4 括号匹配与逆波兰表达式对应的函数 2 ...

最新文章

  1. PMP每日三题(2022年2月14日)
  2. 【渝粤教育】电大中专学前儿童健康教育作业 题库
  3. 怎么把jad反编译放到Eclipse中
  4. 绿联蓝牙驱动 linux,Ugreen绿联蓝牙驱动下载
  5. 【无机纳米材料科研制图——OriginLab 0207】Origin拉平XRD基线
  6. ArcGIS空间数据的拓扑处理
  7. 表格列宽怎么设置?(excel表格)
  8. 电脑网络连接正常,但浏览器无法打开网页的原因和解决方法
  9. 计算机管理员权限设置在哪里设置方法,计算机管理员权限在哪里设置 电脑系统如何设置管理员权限...
  10. Gym - 100889H Hitting Points 计算几何+三分+二分
  11. 绿纹龙的森林游记——UPC
  12. 学计算机主修,大学计算机专业自我介绍(精选5篇)
  13. Calendar 根据指定日期 获取月的第几周
  14. arduino液晶显示频
  15. Python第一次爬虫三部曲 wallhaven壁纸网站(requests库,re正则库)一看就会
  16. 软件接口测试是什么?怎么测?
  17. java实现输入日期
  18. 【经典转载】ERP实施第一级
  19. 设计模式:工厂方法与抽象工厂模式
  20. 定调!深度解读央行DC/EP数字货币在28省市深化试点背后的逻辑

热门文章

  1. 实验五 编写、调试具有多个段的程序
  2. 指针:自定义函数sumDiff(),调用它来求两个数的和、差
  3. Linux 0.00 代码解析(一)
  4. TCP listen() Backlog 参数详解
  5. DSP学习--BCC校验(异或校验)
  6. STM32开发 -- 烧写/启动模式
  7. linux下杀死进程(kill)的N种方法
  8. Breaking the Ledger Security Model
  9. 在Android Native层中创建Java虚拟机实例
  10. Android中关于setLatestEventInfo()过时以及构建Notification的解决方法