八皇后问题

八皇后问题的数学模型:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。

回溯法:解决8queen问题的最简单的思路就是回溯。

  回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为:
1、定义一个解空间,它包含问题的解。
2、利用适于搜索的方法组织解空间。
3、利用深度优先法搜索解空间。
4、利用限界函数避免移动到不可能产生解的子空间。
  问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。
  适用范围:适用于那些不存在简明的数学模型以阐明问题的本质,或者存在数学模型,但是难于实现的问题。
 
  采用回溯法解决queen8问题:
  我们用试探的方法先对问题做一个初步的解释:
  不断的向前试探,但是到第五列的时候,已经找不到一个满足条件的位置了。此时就要回溯,将第五列的皇后拿掉,从当前位置继续向后寻找,即第7个位置,此时第五列仍然没有合适的位置,这时就回退到第4列,再前进一步,后退一步。。。知道找到第八列为止,即找到了一个解决方案。
 
 
  接下来是代码:

  1. //queen8
  2. #include<iostream>
  3. using namespace std;
  4. #define N 8
  5. int y[N+];
  6. int count;
  7. void print();
  8. bool check(int x);
  9. int main()
  10. {
  11. count = ;
  12. for(int i = ;i<;i++)
  13. y[i]=;
  14. int x = ;
  15. while(x>)
  16. {
  17. y[x]++;
  18. while((y[x]<=N) && (!check(x)))
  19. y[x]++;
  20. if(y[x]<=N)
  21. {
  22. if(x==N)
  23. {
  24. count++;
  25. print();
  26. }
  27. else
  28. x++;
  29. }
  30. else
  31. {
  32. y[x]=;
  33. x--;
  34. }
  35. }
  36. system ("pause");
  37. return ;
  38. }
  39. bool check(int x)
  40. {
  41. for(int j=;j<x;j++)
  42. if(abs(j-x)==abs(y[j]-y[x])||y[j]==y[x])
  43. return false;
  44. return true;
  45. }
  46. void print()
  47. {
  48. cout<<count<<endl;
  49. for(int i = ; i<=N;i++)
  50. {
  51. for(int j = ;j<=N;j++)
  52. if(j==y[j])
  53. cout<<'x';
  54. else
  55. cout<<'o';
  56. cout<<endl;
  57. }
  58. }

这样就找到了所有的92种解决方案:

queen8的更多相关文章

  1. 栈(stack)、递归(八皇后问题)、排序算法分类,时间和空间复杂度简介

    一.栈的介绍: 1)栈的英文为(stack)2)栈是一个先入后出(FILO-First In Last Out)的有序列表.3)栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的 ...

随机推荐

  1. Myeclipse8.6配置android_SDK,进行android开发(转载)

    Myeclipse8.6下部署环境,总结一下个人Android环境配置的过程(首先不要急着启动Myeclipse) 1.下载SDK:http://developer.android.com/sdk/i ...

  2. JavaScricp

    常用对话框 1.alert(""):警告对话框,作用是弹出一个警告对话框 2.confirm(""):确定对话框,弹出一个带确定和取消按钮的对话框——确定返回t ...

  3. 在macbook上搭建ubuntu工作环境

    工作环境需要:ubuntu12.04.gcc 4.4.7.vim.source insight.git. 1. 制作启动盘 首先需要制作一个能从苹果电脑启动的ubuntu启动盘: 在苹果电脑的终端中输 ...

  4. N久没写过东西了..写个最近在研究的程序

    import numpy as np import matplotlib.pyplot as plt #a = np.matrix([[1,1.15],[1,1.9],[1,3.06],[1,4.66 ...

  5. .net 事务处理的三种方法

    方法1:直接写入到sql 中 在存储过程中使用 BEGIN TRANS, COMMIT TRANS, ROLLBACK TRANS 实现 begin trans declare@orderDetail ...

  6. DKIM对发送邮件的好处及使用方法

    关于DKIM: What is DKIM? 简单的来说dkim有益于增加邮件服务供应商中的反垃圾邮件系统评分,减少邮件内容被评为垃圾邮件的概率. 但使用它不等同于不会被评为垃圾邮件.另外,邮件的发送次 ...

  7. 就最近学习MVC4.0的页面用法学到的东西

    最近进了一家新公司,学习的东西还是蛮多的,首先了解的是@using(new Ajax.beginForm("",null,new AjaxOptions() { OnSuccess ...

  8. node平台截取图片模块——jimp

    前几天介绍了一个简单的截图模块——iamges,虽然简单,但是功能还是有很多局限的地方. jimp的优势:1.简单,2.支持回调方式和ES6(promise)语法也可以链式调用 3. 丰富的api   ...

  9. Android 获取渠道名称

    直接看代码, //获取渠道名称public static String getChannelName(Activity ctx) { if (ctx == null) { return null; } ...

  10. 浅谈sql的字符分割

    对于oracle:在字符串处理时:经常会遇到字符串分割的问题:可惜SQL中没有split函数:这个倒是挺困扰我们写sql的.对此:我来说说这字符串分割. 例如对字段str中一条数据是'120-mm-2 ...