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. drf序列化高级、自定义只读只写、序列化覆盖字段、二次封装Response、数据库查询优化(断关联)、十大接口、视图家族

    目录 自定义只读 自定义只写 序列化覆盖字段 二次封装Response 数据库关系分析 断外键关联关系 ORM操作外键关系 ORM四种关联关系 基表 系列化类其他配置(了解) 十大接口 BaseSer ...

  2. raid知识梳理及其详细介绍

    1 raid级别 生产环境常用到的raid级别有raid0,raid1,raid5,raid10.所以侧重学习这几种raid级别即可. 1.1 raid0条带卷 raid0示意图: raid0特点介绍 ...

  3. 杭电--1009 C语言实现

    思路:要用有限的猫粮得到最多的javabean,则在房间中得到的javabean比例应尽可能的大. 用一个结构体,保存每个房间中的javabean和猫粮比例和房间号,然后将结构体按比例排序,则从比例最 ...

  4. CentOS 7.6下安装 NVM 管理不同版本的 Node.js

    学习网站:https://www.linuxidc.com/Linux/2019-10/160918.htm

  5. Linux运维---磁盘存储-2. RAID

    随着单块磁盘在数据安全.性能.容量上呈现出的局限,磁盘阵列(Redundant Arrays of Inexpensive/Independent Disks,RAID)出现了,RAID把多块独立的磁 ...

  6. c语言标准I/O

    头文件 <stdio.h> 打开/关闭文件 FILE *fopen(char *filename, char *mode); 如果正常打开返回FILE指针,否则返回NULL mode常用值 ...

  7. 数组翻转(非reverse)

    var arr = [1,2,3,4]; var arr2 = []; while(arr.length) { var num = arr.pop(); //删除数组最后一个元素并返回被删除的元素 a ...

  8. 使用jquery封装的动画脚本(无动画、css3动画、js动画)

    自己封装好的showhide.js 包含无动画.css3动画.js动画 包括:fade(淡入淡出)  slideUpDown(上下滑动)  slideLeftRight(左右滑动)  fadeSlid ...

  9. Windows应急响应和系统加固(2)——Windows应急响应的命令使用和安全检查分析

    Windows应急响应的命令使用和安全检查分析 1.获取IP地址: ·ipconfig /all,获取Windows主机IP地址信息: ·ipconfig /release,释放网络IP位置: ·ip ...

  10. centos5,6的GRUB简介

    grub:GRand Unified Bootloader grub 0.x:grub legacy(centos5,6) grub 1.x:grub2(centos7) grub legacy(gr ...