八皇后是一道很具典型性的题目。它的基本要求是这样的:在一个8*8的矩阵上面放置8个物体,一个矩阵点只允许放置一个物体,任意两个点不能在一行上,也不能在一列上,不能在一条左斜线上,当然也不能在一条右斜线上。

初看到这道题目,大家的第一印象是遍历,但是经过实践之后发现遍历其实不好写,而且复杂度很低。不仅需要遍历8*8*8*8*8*8*8*8*8 = 2^24次数据,还要判断各种条件,实际的计算复杂度还要比较这个高。其实我们仔细看一看,这中间很多的计算其实很多是不需要的,因为如果我们在某一行没有可以插入的数据的话,那么这后面的行其实就不用考虑了。也就是说,我们只有在保证前面 插入的物体都合法有效的情况下,才能进行下一次的物体插入。无谓的遍历只会是无用功。

那么,我们应该怎么做呢?其实步骤不太难:

(1)在第n行寻找可以插入的位置,中间涉及到位置合法性的判断

(2)如果没有可以插入的位置,返回

(3)如果有可以插入的位置, 插入数据。此时再判断是否已经是最后一行,如果是,打印输出返回;反之继续对下一行数据进行试探处理。

有了上面的步骤,我们就可以书写代码了。老规矩,朋友们可以自己先尝试一下。

a)定义全局堆栈和打印函数

  1. static int gEightQueen[8] = {0};
  2. static int gCount = 0;
  3.  
  4. void print()
  5. {
  6. int outer;
  7. int inner;
  8.  
  9. for(outer = 0; outer <8; outer ++){
  10. for(inner = 0; inner < gEightQueen[outer]; inner ++)
  11. printf("* ");
  12.  
  13. printf("# ");
  14.  
  15. for(inner = gEightQueen[outer] + 1; inner < 8; inner ++)
  16. printf("* ");
  17.  
  18. printf("\n");
  19. }
  20.  
  21. printf("=====================================\n");
  22. }

b)添加位置合法性的函数判断

  1. int check_pos_valid(int loop, int value)
  2. {
  3. int index;
  4. int data;
  5.  
  6. for(index = 0; index < loop; index ++){
  7. data = gEightQueen[index];
  8.  
  9. if(value == data)
  10. return 0;
  11.  
  12. if((index + data) == (loop + value))
  13. return 0;
  14.  
  15. if((index - data) == (loop - value))
  16. return 0;
  17. }
  18.  
  19. return 1;
  20. }

c) 八皇后遍历

  1. void eight_queen(int index)
  2. {
  3. int loop;
  4.  
  5. for(loop = 0; loop < 8; loop++){
  6. if(check_pos_valid(index, loop)){
  7. gEightQueen[index] = loop;
  8.  
  9. if(7 == index){
  10. gCount ++, print();
  11. gEightQueen[index] = 0;
  12. return;
  13. }
  14.  
  15. eight_queen(index + 1);
  16. gEightQueen[index] = 0;
  17. }
  18. }
  19. }

总结:

(1)迭代递归是编程的难点,需要自己好好实践,看别人写一百遍,不如自己写一遍

(2)递归的时候务必注意函数return的出口

(3)递归函数中语句的顺序不要随意更换

(4)递归函数中注意数据的保存和恢复

(5)递归函数也要验证,可以用程序验证法,也可以用其他函数的结果来验证

ps:

下面是完整的代码,大家可以直接保存成queue.cpp,直接编译运行即可。可以打印出所有92种情况,

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. static int gEightQueen[8] = {0};
  5. static int gCount = 0;
  6.  
  7. void print()
  8. {
  9. int outer;
  10. int inner;
  11.  
  12. for(outer = 0; outer <8; outer ++){
  13. for(inner = 0; inner < gEightQueen[outer]; inner ++)
  14. printf("* ");
  15.  
  16. printf("# ");
  17.  
  18. for(inner = gEightQueen[outer] + 1; inner < 8; inner ++)
  19. printf("* ");
  20.  
  21. printf("\n");
  22. }
  23.  
  24. printf("=====================================\n");
  25. }
  26.  
  27. int check_pos_valid(int loop, int value)
  28. {
  29. int index;
  30. int data;
  31.  
  32. for(index = 0; index < loop; index ++){
  33. data = gEightQueen[index];
  34.  
  35. if(value == data)
  36. return 0;
  37.  
  38. if((index + data) == (loop + value))
  39. return 0;
  40.  
  41. if((index - data) == (loop - value))
  42. return 0;
  43. }
  44.  
  45. return 1;
  46. }
  47.  
  48. void eight_queen(int index)
  49. {
  50. int loop;
  51.  
  52. for(loop = 0; loop < 8; loop++){
  53. if(check_pos_valid(index, loop)){
  54. gEightQueen[index] = loop;
  55.  
  56. if(7 == index){
  57. gCount ++, print();
  58. gEightQueen[index] = 0;
  59. return;
  60. }
  61.  
  62. eight_queen(index + 1);
  63. gEightQueen[index] = 0;
  64. }
  65. }
  66. }
  67.  
  68. int main(int argc, char* argv[])
  69. {
  70. eight_queen(0);
  71. printf("total = %d\n", gCount);
  72. return 1;
  73. }

c++(八皇后)的更多相关文章

  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种结果.同时可以扩 ...

  10. java实现八皇后问题(递归和循环两种方式)

    循环方式: package EightQueens;   public class EightQueensNotRecursive { private static final boolean AVA ...

随机推荐

  1. Wincc flexable的数据记录的组态

    1.数据记录就是将PLC采集的数据记录下来如下,注意只有TP270和OP270以上的HMI设备才有数据记录 2.练习展示 3.开始创建数据记录 4.组态数据记录 5.组态变量的记录属性.将数据记录和变 ...

  2. 计算机和HMI设备通信之程序上下载

    1.传送模式 2.串行接口传送HMI,软件采用Wincc flexable smart v3 3.设置HMI设备,给HMI设备上电 打开控制面板,双击Transfer 使能Enable Channel ...

  3. 轻量级quill富文本编辑器

    因为公司产品需要在移动端编辑文本,所以发现了这个轻量级的好东西,网上也没找到比较好的案例,就自己总结了下,有兴趣的直接复制代码运行看看就知道啦! 下面是quill.js的CDN加速地址: <!- ...

  4. 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(上)

    前言: 好久没写文章了,最近先是重构IT恋.又重写IT恋中. Sagit框架也不断的更新,调整,现在感觉已完美了了相当的多. 今天不写教程,先简单分享一下技术内容. 1:见Block必有:#defin ...

  5. IE8下实现兼容rgba

    昨天遇到一个问题,要实现一个背景透明的效果,用CSS3用rgba()就能实现,即 background: rgba(0,0,0,.5); 但是要兼容到IE8,就发现没有透明效果,因为IE8不支持rgb ...

  6. APP开发选择什么框架好? 请看这里!

    背景 App的开发一般都需要满足Android和iOS两个系统环境,也就意味着一个App需要定制两套实现方案,造成开发成本和维护成本都很高.为了解决这个问题,最好的办法就是实现一套代码跨端运行,所以H ...

  7. mayavi安装

    Mayavi是python的一个包,提供方便的可视化方案.目前(20150809)Mayavi还没有py3的支持,以下安装环境在python 2.7.10下进行 安装Mayavi: 1. 通过pip ...

  8. How It Works: CMemThread and Debugging Them

    The wait type of CMemThread shows up in outputs such as sys.dm_exec_requests.  This post is intended ...

  9. python 模块:xlrd && xlwt

    主要来自:http://www.jb51.net/article/60510.htm python读excel--xlrd 这个过程有几个比较麻烦的问题,比如读取日期.读合并单元格内容.下面先看看基本 ...

  10. Netty对Protocol Buffer的支持(七)

    Netty对Protocol Buffer的支持(七) 一.简介 在上一篇博文中笔者已经介绍了google的Protocol Buffer的使用,那么本文笔者就开始介绍netty对Protocol B ...