N皇后问题自不必多说,这道题的先行条件是在放置的时候已经指定了一个棋子的位置。

输入第一行为N,第二行为指定棋子的坐标(x,y);输出方案总数以及按字典序升序的各种方案。

思路:

首先是回溯,其次对待指定棋子有三种方法:

  1. 枚举所有情况,最后判断
  2. 在枚举到那一行的时候只让棋子下在指定的那一列
  3. 初始化vis数组时进行标记,同时跳过枚举x行和y列

第三种我没写出来,但很明显比前两种要快得多,第二种比第一种快了100多ms

代码如下:

第一种,耗时327ms:

#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
int n, x, y, tot = 0;
int vis[3][100], c[20];
int ans[1000000][20]; void search(int cur) {
if (cur == n) {
if (c[x] != y) return;
memcpy(ans[tot], c,sizeof(c));
tot++;
}
else for (int i = 0; i < n; i++) {
if (!vis[0][i] && !vis[1][cur + i] && !vis[2][cur - i + n]) {
c[cur] = i;
vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 1;
search(cur + 1);
vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 0;
}
}
} int main() {
scanf("%d", &n);
scanf("%d%d", &x, &y);
x--; y--;
search(0);
printf("%d\n", tot);
for (int i = 0; i < tot; i++) {
for(int j = 0; j < n; j++) {
printf("%d ", ans[i][j] + 1);
}
printf("\n");
}
return 0;
}

第二种,耗时221ms

#include<cstdio>
#include<algorithm>
#include<string.h>
using namespace std;
int n, x, y, tot = 0;
int vis[3][100], c[20];
int ans[1000000][20]; void search(int cur) {
//if (cur == x) { c[cur] = y; search(cur + 1); return; }
if (cur == n) {
//if (c[x] != y) return;
memcpy(ans[tot], c, sizeof(c));
tot++;
}
else for (int i = 0; i < n; i++) {
if (cur == x&&i != y)continue;
if (!vis[0][i] && !vis[1][cur + i] && !vis[2][cur - i + n]) {
c[cur] = i;
vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 1;
search(cur + 1);
vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 0;
}
}
} int main() {
scanf("%d", &n);
scanf("%d%d", &x, &y);
x--; y--; search(0);
printf("%d\n", tot);
for (int i = 0; i < tot; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", ans[i][j] + 1);
}
printf("\n");
}
return 0;
}

回溯经典(指定位置N皇后问题)的更多相关文章

  1. vbscript input select 添加个option根据value值到指定位置--相当于排序

    '添加option到指定位置(按value排序) dim valindex valindex=-1 for i=0 to selcom.length-1 if selcom.Options(i).va ...

  2. 横向滑动的HorizontalListView滑动指定位置的解决方法

    项目中用到了自定义横向滑动的控件:HorizontalListView,点击其中一项,跳转到另外一个大图界面,大图界面也是HorizontalListView,想使用setSelection方法设定 ...

  3. shell如何在指定文件的指定位置后面添加内容

    最近工作中遇到一个问题,想在某个文件的指定位置后面添加一个标志位,要求在shell脚本里实现. 问题说明: 想在sys_config.fex文本的某个字符串后面添加一个flag 例如:sys_conf ...

  4. jQuery滚动条回到顶部或指定位置

    jQuery滚动条回到顶部或指定位置 在很多网站,为了增强用户体验,我们会看到回到顶部的按钮,不用手动拖拽滚动条就能回到顶部,非常方便.下面就介绍用jquery实现的滚动到顶部的代码 $(functi ...

  5. 使用C语言在Win控制台中实现指定位置输出

    在古老的Turbo C中有个GotoXY可以让你在指定坐标中输出文字,可恨的是我看过的C语言书籍,有一半都是关于它的.我现在用着Windows系统,不可能还让我去写着DOS程序啊,起码也得从Win控制 ...

  6. python删除指定位置 2个元素

    # -*- coding: utf-8 -*-__author__ = 'Administrator'import bisect#排序说明:http://en.wikipedia.org/wiki/i ...

  7. C# 将窗口移动到指定位置

    private void button1_Click(object sender, EventArgs e) { Frm f = new Frm(); f.StartPosition = FormSt ...

  8. ListVeiw新增记录及 滚动条移动到指定位置

    C# 自带的ListView控件的滚动条移动到指定位置. lvwList为ListView控件 lvwList.EnsureVisible(lvwList.Items.Count - 1); 新增记录 ...

  9. 自定义ScrollViewer的Touch事件--触摸上下移动ScrollViewer滚动到指定位置

    double mPointY;//触摸点的Y坐标 double mOffsetY;//滚动条当前位置 bool mIsTouch = false;//是否触摸 //触摸事件 private void ...

随机推荐

  1. ospfv3 lsa database

    https://www.networkfuntimes.com/ospfv3-the-new-lsa-types-in-ipv6-ospf/ WHY DID THEY CHANGE THE LSAs ...

  2. UI自动化框架搭建

    1.目录结构 大概分为以下几个文件 common :主要是用来放一些封装的公共函数 outputs :主要是输出一些文件,失败截图.用例执行完的测试报告 pagelocate :主要是元素的定位 pa ...

  3. python OpenCV安装

    linux系统 yum install -y libSM.x86_64 libXext.x86_64 libXrender.x86_64 pip install numpy Matplotlib pi ...

  4. .NET代码混淆工具NET Reactor - 初学者系列-学习者系列文章

    这几天无事,除了看书,然后就倒腾原来的代码.想起.NET的代码混淆工具软件,所以今天就讲讲这个.NET代码混淆工具. .NET代码混淆工具软件,以前有了解和找过,但是当时需求不大,所以找了下就搁置了. ...

  5. ElasticSearch集群-Windows

    概述 ES集群是一个P2类型的分布式系统,除了集群状态管理以外,其他所有的请求都可以发送到集群内任意一台节点上,这个节点可以自己找到需要转发给哪些节点,并且直接跟这些节点通信.所以,从网络架构及服务配 ...

  6. vscode+php+xdebug Time-out connecting to client (Waited: 200 ms)

    如果php.ini配置没错,且端口无误,那么就可能是配置文件选错了. vscode里面有两个配置文件,一个是 Listen for xdebug ,一个是 Lanuch currently open ...

  7. cesium结合geoserver利用WFS服务实现图层新增(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  8. 微信小程序入门笔记-使用云开发(4)

    1.云数据库 一.介绍 云开发提供了一个 JSON 数据库,顾名思义,数据库中的每条记录都是一个 JSON 格式的对象.一个数据库可以有多个集合(相当于关系型数据中的表),集合可看做一个 JSON 数 ...

  9. JS中变量、作用域的本质,定义及使用方法

    全局作用域和局部作用域 全局作用域 局部作用域:函数作用域 全局作用域在全局和局部都可以访问到,局部作用域只能在局部被访问到 var name="cyy"; function fn ...

  10. 大二网课ing学习周记

    行稳致远,久久为功! 一个概念套着一个概念哦!码就是关键字,标识属性是也! 1.什么是主码和外码,请举例说明. 关键字也叫码! 首先,在一个关系中,能惟一标识元组的属性or最小属性集称为关系的候选码. ...