题目描述

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。

对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。

给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。

输入

第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92)

输出

输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。

样例输入

3

6

4

25

样例输出

25713864

17582463

36824175

思路

八皇后问题的答案有92个,首先按照字典序生成这92个答案,然后根据下标查询即可。生成八皇后直接按行的顺序生成八个全排列,这八个全排列即为八行中每行皇后的位置,也就是列号,然后检查满足限制条件即可。

简单的暴力生成版本:

  1. int count = 0;
  2. int n, p[maxn];
  3. bool hash_table[maxn] = {false};
  4. void generate_p(int index)
  5. {
  6. if (index == n + 1) { // 判断全排列满足条件
  7. bool flag = true;
  8. for (int i = 1; i <= n; i++) {
  9. for (int j = i + 1; j <= n; j++) {
  10. if (abs(i - j) == abs(p[i] - p[j]))
  11. flag = false;
  12. }
  13. }
  14. if (flag)
  15. count++;
  16. return;
  17. }
  18. for (int x = 1; x <= n; x++) {
  19. if (hash_table[x] == false) {
  20. p[index] = x;
  21. hash_table[x] = true;
  22. generate_p(index + 1);
  23. hash_table[x] = false;
  24. }
  25. }
  26. }

由于某些全排列序列在前几个数出来时就可以判断是错误答案了,所以可以稍微优化以下代码,加上剪枝回溯的版本:

  1. int count = 0;
  2. int n, p[maxn];
  3. bool hash_table[maxn] = {false};
  4. void generate_p(int index)
  5. {
  6. if (index == n + 1) {
  7. count++;
  8. return;
  9. }
  10. for (int x = 1; x <= n; x++) {
  11. if (hash_table[x] == false) {
  12. bool flag = true; // 剪枝
  13. for (int pre = 1; pre < index; pre++) {
  14. if (abs(index - pre) == abs(x - p[pre])) {
  15. flag = false;
  16. break;
  17. }
  18. }
  19. if (flag == true) {
  20. p[index] = x;
  21. hash_table[x] = true;
  22. generate_p(index + 1);
  23. hash_table[x] = false;
  24. }
  25. }
  26. }
  27. }

代码

  1. #include <cstdio>
  2. #include <algorithm>
  3. const int maxn = 11;
  4. int n, p[maxn];
  5. bool hash_table[maxn] = {false};
  6. int count = 0;
  7. int solve[100] = {0};
  8. void generate_p(int index)
  9. {
  10. if (index == n + 1) {
  11. count++;
  12. int tmp = 0;
  13. for (int i = 1; i <= n; i++) {
  14. tmp = tmp * 10 + p[i];
  15. }
  16. solve[count] = tmp;
  17. return;
  18. }
  19. for (int x = 1; x <= n; x++) {
  20. if (hash_table[x] == false) {
  21. bool flag = true;
  22. for (int pre = 1; pre < index; pre++) {
  23. if (abs(index - pre) == abs(x - p[pre])) {
  24. flag = false;
  25. break;
  26. }
  27. }
  28. if (flag == true) {
  29. p[index] = x;
  30. hash_table[x] = true;
  31. generate_p(index + 1);
  32. hash_table[x] = false;
  33. }
  34. }
  35. }
  36. }
  37. int main()
  38. {
  39. int m, t;
  40. n = 8;
  41. generate_p(1);
  42. scanf("%d", &m);
  43. while (m--) {
  44. scanf("%d", &t);
  45. printf("%d\n", solve[t]);
  46. }
  47. return 0;
  48. }

[codeup] 2046 八皇后的更多相关文章

  1. 八皇后算法的另一种实现(c#版本)

    八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...

  2. 数据结构0103汉诺塔&八皇后

    主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...

  3. Python学习二(生成器和八皇后算法)

    看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...

  4. Python解决八皇后问题

    最近看Python看得都不用tab键了,哈哈.今天看了一个经典问题--八皇后问题,说实话,以前学C.C++的时候有这个问题,但是当时不爱学,没搞会,后来算法课上又碰到,只是学会了思想,应该是学回溯法的 ...

  5. OpenJudge1700:八皇后问题 //不属于基本法的基本玩意

    1700:八皇后问题//搜索 总时间限制:  10000ms 内存限制:  65536kB 描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方. 输入 无输入. 输出 按给定顺序和 ...

  6. C#八皇后问题 枚举值

    记得刚出道的时候, 有考虑怎么面试, 以及可能会遇到的面试题, 有一个人说了一下 八皇后问题, 据说要用 sql 语句写出来, 暂时我 写了一个C#版本的, 经测验,八皇后算法结果为 92种, 这个与 ...

  7. 八皇后(dfs+回溯)

    重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次: 方法1:逐行放置皇后,然后递归: 代码: #include <bits/stdc++.h> #define MAXN 8 # ...

  8. C语言解决八皇后问题

    #include <stdio.h> #include <stdlib.h> /* this code is used to cope with the problem of ...

  9. 八皇后,回溯与递归(Python实现)

    八皇后问题是十九世纪著名的数学家高斯1850年提出 .以下为python语句的八皇后代码,摘自<Python基础教程>,代码相对于其他语言,来得短小且一次性可以打印出92种结果.同时可以扩 ...

随机推荐

  1. 【转】【译】【Win10】在你的程序标题栏中显示后退按钮

    原文地址:http://www.sharpgis.net/post/2015/05/21/Displaying-a-backbutton-in-your-app-window 免责声明:这篇文章基于 ...

  2. WebService 工作原理及实例教程

    一.WebService到底是什么? 先来看下标准的定义:Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统 ...

  3. .NET Core 和 .NET .Framework 速度比较

    废话不多说! 一下是 .NET core 和 .NET framework 速度对比. 两者使用最慢的冒泡排序算法:  排序10万条数据 次数 .NET CORE(耗时) .NET framework ...

  4. 构建NetCore应用框架之实战篇系列

    构建NetCore应用框架之实战篇 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构 构建Net ...

  5. 初识GitHub与Git

    在初次接触GitHub的时候,英语渣渣本渣真是深感无奈啊..... ORZ 在好友的帮助下,也算是初步入门了吧. 谨以此文作为初级使用手册记录,希望能帮助到你. 一.首先要申请一个GitHub账户 二 ...

  6. UE4随笔 二 第一印象

    打开UE4,短暂的兴奋过后,开始大概扫一扫UE4的编辑器,整个界面比UE3更有现代气息: 之前看其他人写的文章,虚幻4最重要的改动集中在下面几个方向上: 跨平台: WIN和MAC平台都能使用,这就意味 ...

  7. 如何学习、了解Kubernetes?

    欢迎访问网易云社区,了解更多网易技术产品运营经验 [Kubernetes官方文档](https://kubernetes.io/docs/tutorials/)是最基本的入门教材,这里的内容是最官方, ...

  8. 基于GitLab与Git Extensions搭建版本控制工具

    1.背景 大家知道GitHub是现在非常流行的代码托管工具,但是如果有些项目不想开源的话,则需要付费,因此萌生了自己搭建一个Git的版本控制工具,供内网使用.GitLab则是个好的选择,但是GitLa ...

  9. 【AUTO Uninstaller 中文版-详细使用教程】AUTODESK系列软件MAYA/CAD/3DSMAX/INVENTOR终极完美修复卸载工具 Windows x64位 【原创搬家】

    小伙伴是不是遇到 MAYA/CAD/3DSMAX/INVENTOR/REVIT 安装失败或者安装不了的问题了呢?AUTODESK系列软件着实令人头疼,MAYA/CAD/3DSMAX/INVENTOR/ ...

  10. 双11,自动领取优惠券 js 代码

    http://www.zhihu.com/question/36426051/answer/67690322 本来我不熟悉 js,正好研究一下 (function(window, document) ...