回溯经典(指定位置N皇后问题)
N皇后问题自不必多说,这道题的先行条件是在放置的时候已经指定了一个棋子的位置。
输入第一行为N,第二行为指定棋子的坐标(x,y);输出方案总数以及按字典序升序的各种方案。
思路:
首先是回溯,其次对待指定棋子有三种方法:
- 枚举所有情况,最后判断
- 在枚举到那一行的时候只让棋子下在指定的那一列
- 初始化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皇后问题)相关推荐
- php 文件指定位置添加内容,C++_VC++在TXT文件指定位置追加内容的方法,本文实例讲述了VC++操作文本文 - phpStudy...
VC++在TXT文件指定位置追加内容的方法 本文实例讲述了VC++操作文本文件的方法,实现在txt文件指定位置插入内容.对于VC++爱好者有一定的学习参考价值. 主要功能代码如下: void CGoT ...
- C语言实现文件的局部修改,C语言:在文件的指定位置实现局部修改,而无需重写文件的其他部分...
前言(可跳过) 在进行大型文件的读写操作时,若采用读打开文件a,再将"a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容"保存到文件b,关闭并删除文件a,将文件 ...
- 【动态规划】象棋里马走到指定位置的方法数(java)
动态规划--马走到指定位置的方法数 马走到指定位置的方法数 暴力递归 代码演示 动态规划 代码演示 动态规划专题 马走到指定位置的方法数 想象一个象棋的棋盘, 然后把整个棋盘放入第一象限,棋盘的最左下 ...
- Java List 更换指定位置的元素
Java List 更换指定位置的元素 使用的方法是list.set() 方法 下面写一个list 说下具体的使用 List<String> list = new ArrayList< ...
- C++ 笔记(23)— STL vector 类(实例化 vector、末尾插入、指定位置插入、数组方式访问元素、指针方式访问元素、删除元素、大小与容量区别)
1. vector 特点 vector 是一个模板类,提供了动态数组的通用功能,具有如下特点: 在数组末尾添加元素所需的时间是固定的,即在末尾插入元素的所需时间不随数组大小而异,在末尾删除元素也如此: ...
- python删除指定位置的字符串_python去除区域 python删除字符串中指定位置字符
python删除字符串中指定位置字符 原程序是这样的: ser = serial.Serial("/dev/ttyAMA0", 9600) def main字符串的话,你可以把他当 ...
- 【字符串操作之】返回指定位置的字符和Unicode 字符代码 根据unicode返回字符→→charAt、charCodeAt和fromCharCode...
//charAt和charCodeAt分别返回指定位置处的字符和字符对应的unicode码 var str:String="abcdefg"; var str2=str.charA ...
- swif 在字符串中查找特定字符索引以及改变字符串的指定位置的颜色 字体大小
1 第一种方式 var text = "谁包含这个字母";let range:Range<String.Index> = text.range(of: "含& ...
- vbscript input select 添加个option根据value值到指定位置--相当于排序
'添加option到指定位置(按value排序)dim valindexvalindex=-1for i=0 to selcom.length-1if selcom.Options(i).value ...
最新文章
- 基于FPGA的波速形成实现
- 大数据和个性化设计是用户体验(UX)的未来
- Linux netstat查看网络连接信息
- 子函数的指针释放问题
- JavascriptDOM(三)
- 前后端敏感数据加密方案及实现_01
- android小球移动代码,Android中如何绘制一个跟随手指移动的小球
- 分数的计算机应用教案,计算机应用实训实验
- UVa10340 - All in All
- hdu 4911 “Inversion”——逆序对问题
- python 课程设计扫雷报告_《扫雷课程设计报告.doc
- 错误:Cannot construct instance of `xxxx` (no Creators, like default construct , exist): cannot .......
- petalinux常用命令(转载)
- 一个典型业务系统卡顿故障分析
- C#实现多人语音聊天
- 正则只保留括号里的内容
- java怎么给文本框加滚动条_懂Java中Swing的朋友,谁能帮我在Jtextare上加一个滚动条啊?很急!...
- 淘宝二维码对网店推广的好处
- 华为 5700交换机ACL traffic behavior命令 deny permit
- Shell脚本中获取命令运行结果、特殊变量使用、条件判断等常用操作