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;
}

转载于:https://www.cnblogs.com/romaLzhih/p/9489818.html

回溯经典(指定位置N皇后问题)相关推荐

  1. php 文件指定位置添加内容,C++_VC++在TXT文件指定位置追加内容的方法,本文实例讲述了VC++操作文本文 - phpStudy...

    VC++在TXT文件指定位置追加内容的方法 本文实例讲述了VC++操作文本文件的方法,实现在txt文件指定位置插入内容.对于VC++爱好者有一定的学习参考价值. 主要功能代码如下: void CGoT ...

  2. C语言实现文件的局部修改,C语言:在文件的指定位置实现局部修改,而无需重写文件的其他部分...

    前言(可跳过) 在进行大型文件的读写操作时,若采用读打开文件a,再将"a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容"保存到文件b,关闭并删除文件a,将文件 ...

  3. 【动态规划】象棋里马走到指定位置的方法数(java)

    动态规划--马走到指定位置的方法数 马走到指定位置的方法数 暴力递归 代码演示 动态规划 代码演示 动态规划专题 马走到指定位置的方法数 想象一个象棋的棋盘, 然后把整个棋盘放入第一象限,棋盘的最左下 ...

  4. Java List 更换指定位置的元素

    Java List 更换指定位置的元素 使用的方法是list.set() 方法 下面写一个list 说下具体的使用 List<String> list = new ArrayList< ...

  5. C++ 笔记(23)— STL vector 类(实例化 vector、末尾插入、指定位置插入、数组方式访问元素、指针方式访问元素、删除元素、大小与容量区别)

    1. vector 特点 vector 是一个模板类,提供了动态数组的通用功能,具有如下特点: 在数组末尾添加元素所需的时间是固定的,即在末尾插入元素的所需时间不随数组大小而异,在末尾删除元素也如此: ...

  6. python删除指定位置的字符串_python去除区域 python删除字符串中指定位置字符

    python删除字符串中指定位置字符 原程序是这样的: ser = serial.Serial("/dev/ttyAMA0", 9600) def main字符串的话,你可以把他当 ...

  7. 【字符串操作之】返回指定位置的字符和Unicode 字符代码 根据unicode返回字符→→charAt、charCodeAt和fromCharCode...

    //charAt和charCodeAt分别返回指定位置处的字符和字符对应的unicode码 var str:String="abcdefg"; var str2=str.charA ...

  8. swif 在字符串中查找特定字符索引以及改变字符串的指定位置的颜色 字体大小

    1 第一种方式 var text = "谁包含这个字母";let range:Range<String.Index> = text.range(of: "含& ...

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

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

最新文章

  1. 基于FPGA的波速形成实现
  2. 大数据和个性化设计是用户体验(UX)的未来
  3. Linux netstat查看网络连接信息
  4. 子函数的指针释放问题
  5. JavascriptDOM(三)
  6. 前后端敏感数据加密方案及实现_01
  7. android小球移动代码,Android中如何绘制一个跟随手指移动的小球
  8. 分数的计算机应用教案,计算机应用实训实验
  9. UVa10340 - All in All
  10. hdu 4911 “Inversion”——逆序对问题
  11. python 课程设计扫雷报告_《扫雷课程设计报告.doc
  12. 错误:Cannot construct instance of `xxxx` (no Creators, like default construct , exist): cannot .......
  13. petalinux常用命令(转载)
  14. 一个典型业务系统卡顿故障分析
  15. C#实现多人语音聊天
  16. 正则只保留括号里的内容
  17. java怎么给文本框加滚动条_懂Java中Swing的朋友,谁能帮我在Jtextare上加一个滚动条啊?很急!...
  18. 淘宝二维码对网店推广的好处
  19. 华为 5700交换机ACL traffic behavior命令 deny permit
  20. Shell脚本中获取命令运行结果、特殊变量使用、条件判断等常用操作

热门文章

  1. Swift中使用构建配置来支持条件编译-b
  2. Android Service详解(二)第一个Service
  3. mysql 控制台操作命令
  4. 自动装箱与自动拆箱的一些问题
  5. 嵌入式Linux全攻略 ACE程序移植过程详细讲解
  6. 概率编程库Pymc3案例之Coal mining disasters
  7. HtmlUnit采集页面信息加工并写入excel表
  8. 软件作坊模式工件应用论
  9. Ubuntu中Netbeans的中文问题彻底解决
  10. 华为p40论坛_花粉俱乐部网友:华为P40千万别上双扬声器,小米10方向错了