数据结构学习之栈求解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");
else
printf("*");
}
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行的结果是可以的。
数据结构学习之栈求解n皇后问题的更多相关文章
- c语言数据结构学习心得——栈
栈(Stack) 只允许在一端进行插入或删除操作的线性表 栈顶(Top):栈中允许进行插入和删除操作的那一端: 栈底(Bottom):固定的,不允许进行插入或删除的另一端 1.栈是受限的线性表,所以自 ...
- 数据结构应用实例#栈&单链表#简易计算器
修改BUG的时候一不小心BUG越修越多,鉴于维护程序并不是学习数据结构的初衷,我已经果断的弃坑了!! 以下内容再不更新,Github上的代码直接无法正常编译运行.... 参考参考就好,学习到栈的作用就 ...
- C语言- 基础数据结构和算法 - 栈的顺序存储
听黑马程序员教程<基础数据结构和算法 (C版本)>, 照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1 喜欢的朋友 ...
- javascript数据结构与算法---栈
javascript数据结构与算法---栈 在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈 ...
- 算法设计和数据结构学习_5(BST&AVL&红黑树简单介绍)
前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm analysis in c++ (second ed ...
- JavaScript数据结构和算法----栈
前言 栈是一种遵循后进先出(LIFO)原则的有序集合,新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另外一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底.可以想象桌上的一叠书,或者厨房里的 ...
- 数据结构学习之字符串匹配算法(BF||KMP)
数据结构学习之字符串匹配算法(BF||KMP) 0x1 实验目的 通过实验深入了解字符串常用的匹配算法(BF暴力匹配.KMP.优化KMP算法)思想. 0x2 实验要求 编写出BF暴力匹配.KM ...
- Javascript数据结构与算法--栈的实现与用法
栈数据结构 栈是一种遵从后进先出(LIFO)原则的有序集合.新添加的或者待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底. 我们在生活中常能看到栈的 ...
- USACO 1.5.4 Checker Challenge跳棋的挑战(回溯法求解N皇后问题+八皇后问题说明)
Description 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子. 列号 0 1 2 3 4 5 6 ...
随机推荐
- Exp2后门原理与实践 20164312马孝涛
实验内容 使用netcat获取主机操作Shell,cron启动 (0.5分) 使用socat获取主机操作Shell, 任务计划启动 (0.5分) 使用MSF meterpreter(或其他软件)生成可 ...
- 开放windows服务器端口-----以打开端口8080为例
[转载]原文地址:https://blog.csdn.net/spt_dream/article/details/75014619 本文记录两个内容: 1.win7下打开端口 2.服务器(2003或者 ...
- ansible基础-优化
简介 当管理集群达到一定规模时,ansible达到性能瓶颈是难以避免的,此时我们可以通过一定手段提高ansible的执行效率和性能. 笔者虽未管理过超大规模服务器,但也通过查找资料和咨询大神了解了一些 ...
- Spring Boot 2.2 增加了一个新功能,启动飞起~
前几天栈长分享了一个好玩的框架:一个比Spring Boot快44倍的Java框架!,是不是感觉 Spring Boot 略慢?今天讲一下 Spring Boot 添加的这个新特性,可以大大提升 Sp ...
- FragmentTabHostUnderLineDemo【FragmentTabHost带下划线】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 使用FragmentTabHost实现顶部选项卡(带下划线效果)展现. 效果图 代码分析 1.该Demo中采用的是FragmentT ...
- SpringBoot进阶教程(二十二)集成RabbitMQ---MQ实战演练
RabbitMQ是一个在AMQP基础上完成的,可复用的企业消息系统.他遵循Mozilla Public License开源协议.RabbitMQ是流行的开源消息队列系统,用erlang语言开发.Rab ...
- DotNetCore深入了解之三HttpClientFactory类
当需要向某特定URL地址发送HTTP请求并得到相应响应时,通常会用到HttpClient类.该类包含了众多有用的方法,可以满足绝大多数的需求.但是如果对其使用不当时,可能会出现意想不到的事情. usi ...
- C++11 (多线程)并发编程总结
| 线程 std::thread 创建std::thread,一般会绑定一个底层的线程.若该thread还绑定好函数对象,则即刻将该函数运行于thread的底层线程. 线程相关的很多默认是move语义 ...
- 制造业物料清单BOM、智能文档阅读、科学文献影响因子、"Celebrated Italian mathematician ZepartzatT Gozinto" 与 高津托图
意大利数学家Z.高津托 意大利伟大数学家Sire Zepartzatt Gozinto的生卒年代是一个谜[1],但是他发明的 “高筋图” 在 制造资源管理.物料清单(BOM)管理.智能阅读.科学文献影 ...
- SmartSql Cache标签
Demo <Cache Id="T_Test.LruCache" Type="Lru"> <Parameter Key="Cache ...