数据结构学习之栈求解n皇后问题
数据结构学习之栈求解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皇后问题相关推荐
- Python数据结构学习笔记——栈
目录 一.栈的定义和特性 (一)栈的定义 (二)栈的反转特性 二.实现分析步骤 三.栈的Python实现代码 四.栈的应用 (一)匹配圆括号 (二)匹配符号 (三)模2除法(十进制转二进制) (四)进 ...
- 数据结构学习笔记——栈(1)定义理解
写在前面的话--努力不晚 博主是某985学校数字媒体技术专业的本科在读生,即将成为大四狗,今后打算国内读研. 因为数媒专业设置的缘故,前两年尝试了很多艺术和设计方面的东西:素描.设计原理.UI.视频剪 ...
- 数据结构学习笔记——栈和队列
4 栈与队列 栈是限定仅在表尾进行插入和删除操作的线性表.队列是只允许在一端进行插入操作.而在另一端进行删除操作的线性表. 4.1 栈的定义 栈(stack)是限定仅在表尾进行插入和删除操作的线性 ...
- 数据结构学习笔记——栈的基本知识和顺序存储结构实现栈(顺序栈)
目录 一.栈 (一)栈的概念 (二)栈的排列 (三)共享栈 (四)栈的常见应用 二.顺序栈的定义 三.顺序栈的初始化 四.判断顺序栈是否为空栈 五.判断顺序栈是否为满栈 六.进栈(插入操作) 七.出栈 ...
- java栈和队列实现删除,数据结构学习--Java栈和队列
栈:先进后出 队列:先进先出 都是数组存放,但是删除的时候不是删除了数组中的数据,而是使用增加游标标识的方式实现删除,"游标标识"加加或者减减完成删除操作,查看的时候,也不是直接查 ...
- 408数据结构学习笔记——栈和队列的应用、特殊矩阵的压缩
目录 1.栈在括号匹配中的应用 2.栈在表达式求值中的运用 2.1.中缀表达式转换后缀表达式 2.2.后缀表达式的计算方法 2.3.中缀表达式转换前缀表达式 2.4. 中缀表达式转后缀表达式(机算- ...
- Python数据结构学习笔记——队列和双端队列
目录 一.队列的定义 二.队列 实现步骤分析 三.队列的Python实现代码 四.队列的应用 六人传土豆游戏 五.双端队列的定义 六.双端队列 实现步骤分析 七.双端队列的Python实现代码 八.双 ...
- 栈和队列求解迷宫问题(数据结构学习笔记)
文章目录 迷宫问题 "栈"求解迷宫问题 行走规则 算法思路 算法代码 栈的定义 算法设计 完整代码 最终迷宫路径 算法总结 "队列"求解迷宫问题 算法思路 算法 ...
- C++ 数据结构学习 ---- 栈及其应用
目录 1.头文件 1.1 Stack.h 1.2主文件头文件 2.栈的应用 2.1 进制转换器 2.2 进制转换器运行截图 2.3 括号匹配玉逆波兰表达式 2.4 括号匹配与逆波兰表达式对应的函数 2 ...
最新文章
- PMP每日三题(2022年2月14日)
- 【渝粤教育】电大中专学前儿童健康教育作业 题库
- 怎么把jad反编译放到Eclipse中
- 绿联蓝牙驱动 linux,Ugreen绿联蓝牙驱动下载
- 【无机纳米材料科研制图——OriginLab 0207】Origin拉平XRD基线
- ArcGIS空间数据的拓扑处理
- 表格列宽怎么设置?(excel表格)
- 电脑网络连接正常,但浏览器无法打开网页的原因和解决方法
- 计算机管理员权限设置在哪里设置方法,计算机管理员权限在哪里设置 电脑系统如何设置管理员权限...
- Gym - 100889H Hitting Points 计算几何+三分+二分
- 绿纹龙的森林游记——UPC
- 学计算机主修,大学计算机专业自我介绍(精选5篇)
- Calendar 根据指定日期 获取月的第几周
- arduino液晶显示频
- Python第一次爬虫三部曲 wallhaven壁纸网站(requests库,re正则库)一看就会
- 软件接口测试是什么?怎么测?
- java实现输入日期
- 【经典转载】ERP实施第一级
- 设计模式:工厂方法与抽象工厂模式
- 定调!深度解读央行DC/EP数字货币在28省市深化试点背后的逻辑
热门文章
- 实验五 编写、调试具有多个段的程序
- 指针:自定义函数sumDiff(),调用它来求两个数的和、差
- Linux 0.00 代码解析(一)
- TCP listen() Backlog 参数详解
- DSP学习--BCC校验(异或校验)
- STM32开发 -- 烧写/启动模式
- linux下杀死进程(kill)的N种方法
- Breaking the Ledger Security Model
- 在Android Native层中创建Java虚拟机实例
- Android中关于setLatestEventInfo()过时以及构建Notification的解决方法