皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。

解决八皇后问题,要分成几个步骤。

第一步:思考要解决的问题

1.用什么数据结构来描述棋盘,怎样描述棋盘。

2.怎样描述皇后(包括皇后的位置,怎样移动皇后等)。

3.怎样开始程序。

第二步:初步解决问题,列出大纲

1.我们用一个名为Queens的类来表达皇后,用一个方法来向棋盘中插入新的皇后,函数的参数就是皇后的一个对象,定义函数为solve_from(Quenns configuration)

2.sove_from(Queens configuration)方法框架,只是伪代码(下面的步骤会详细写这个函数)

public void solve_from(Queens configuration)

{

if  Queens configuration表明八个皇后已经全部放入棋盘

打印出八个皇后所在的位置

else

循环棋盘的第n行(第n-1行有皇后,第n行没有皇后)可以放皇后的每个格子

{

在该行增加一个皇后;

solve_from(configuration);

将皇后从configuration的格子中移走

}

}

3.Queens类定义大纲

内置函数

①.bool unguarded(int col)    方法说明:根据首个空行,第count行第col列中的格子是否未被任何皇后设防而返回true或者false。(所谓设防就是一个皇后所导致的不允许放其他皇后的位置)

②.void insert(int col)  方法说明: 在第count行第col列插入一个皇后,前提是该格子未被任何皇后设防,增加皇后后行数count加一

③. void remove(int col)  方法说明: 移去count行col列里面的皇后,count减去1

④.is_solved()  方法说明: 判断皇后的个数是不是等于8 如果等于8则返回true 否则返回false

⑤. print()  方法说明:打印所有皇后的位置

第三步:细化解决问题

主函数 main

int main()

{

Queens configuration(8);

solve_from(configuration);

}

函数solve_from(Queens configuration)

void solve_from(Queens configration)

{

if(configuraton.is_solved())

configuration.print();

else

for(int col=0;col<8;col++)

{

if(configuration.unguarded(col))

{

configuration.insert(col);

solve_from(configuration);//这里是一个递归,仔细思考,想通的话,其乐无穷

configuration.remove(col);

}

}

}

类Queens

class Queens{

bool is_solved(){if(count>8)return true;else return false;}

void print(){

for(int i=0;i<8;i++)

{

for(int j=0;j<8;j++)

{

if(queen_square[i][j]==true)

{

Console.Write(i+"_"+j);

}

}

}

}

bool unguarded(int col){

int i;

bool ok=true;

for(i=0;ok&&i<count;i++)

ok=!queen_square[i][col];

for(i=1;ok&&count-i>0&&col-i>=0;i++)

ok=!queen_square[count-i][col-i];

for(i=1;ok&&count-i>0&&col+i<8;i++)

return !queen_square[count-i][col+i];

return ok;

}

bool insert(){queen_square[count][col]=true;count++;}

void remove(queen_square[count][col]=false;count--;);

int count;

bool queen_square[8][8];//用二维数组存储棋盘

}

总结:八皇后问题递归法解答感觉困难,实际上做起来只要思路清晰并不复杂,这个程序还可以优化,以后会续写

八皇后问题详细分析与解答(递归法解答,c#语言描述)的更多相关文章

  1. 归并排序,递归法,C语言实现。

    利用归并排序法对序列排序的示意图(递归法): 一.算法分析:利用递归的分治方法:1.将原序列细分,直到成为单个元素:2.在将分割后的序列一层一层地按顺序合并,完成排序.细分通过不断深入递归完成,合并通 ...

  2. java递归求八皇后问题解法

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

  3. LeetCode 回溯法 别人的小结 八皇后 递归

    #include <iostream> #include <algorithm> #include <iterator> #include <vector&g ...

  4. 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)

    本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...

  5. 八皇后问题-dfs

    一.题意解析 国际象棋中的皇后,可以横向.纵向.斜向移动.如何在一个8X8的棋盘上放置8个皇后,使得任意两个皇后都不在同一条横线.竖线.斜线方向上?八皇后问题是一个古老的问题,于1848年由一位国际象 ...

  6. 一道算法题-八皇后问题(C++实现)

    八皇后问题 一.题意解析 国际象棋中的皇后,可以横向.纵向.斜向移动.如何在一个8X8的棋盘上放置8个皇后,使得任意两个皇后都不在同一条横线.竖线.斜线方向上?八皇后问题是一个古老的问题,于1848年 ...

  7. 八皇后问题 递归实现 C语言 超详细 思路 基础

    八皇后问题 :假设 將八个皇后放到国际象棋盘上,使其两两之间无法相互攻击.共有几种摆法? 基础知识: 国际象棋里,棋盘为8X8格. 皇后每步可以沿直线.斜线 走任意格. 思路: 1.想把8个皇后放进去 ...

  8. 7, java数据结构和算法: 八皇后问题分析和实现 , 递归回溯

    什么是八皇后问题: 指的是,在一个8 * 8的棋盘中, 放置8个棋子, 保证这8个棋子相互之间, 不在同一行,同一列,同一斜线, 共有多少种摆法? 游戏连接: http://www.4399.com/ ...

  9. LeetCode 31:递归、回溯、八皇后、全排列一篇文章全讲清楚

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天我们讲的是LeetCode的31题,这是一道非常经典的问题,经常会在面试当中遇到.在今天的文章当中除了关于题目的分析和解答之外,我们还会 ...

随机推荐

  1. jsp生命周期和工作原理

    jsp的工作原理jsp是一种Servlet,但是与HttpServlet的工作方式不太一样.httpservlet是先由源代码编译为class文件后部署到服务器下的,先编译后部署.而jsp则是先部署后 ...

  2. [转]SELinux管理与配置

    原文链接:http://blog.csdn.net/huangbiao86/article/details/6641893 1.1 SElinux概述 SELinux(Security-Enhance ...

  3. 修改linux文件权限命令:chmod 【转载】

    Linux系统中的每个文件和目录都有访问许可权限,用它来确定谁可以通过何种方式对文件和目录进行访问和操作. chmod  命令可以改变所有子目录的权限,下面有2种方法 改变一个文件的权限: chmod ...

  4. 分享非常有用的Java程序(关键代码)(七)---抓屏程序

    原文:分享非常有用的Java程序(关键代码)(七)---抓屏程序 import java.awt.Dimension; import java.awt.Rectangle; import java.a ...

  5. Jquery progressbar通过Ajax请求获取后台进度演示

    项目源代码下载:http://download.csdn.net/detail/nuptboyzhb/6262253 1.简介 本文主要演示Jquery progressbar的进度条功能.js通过a ...

  6. c语言,volatile

          一.意义: 该关键字的意义就是表示定义的变量值随时都会改变,必须从变量的地址处读取值,所以只有这个变量在使用过程中可能被改变(比如中断程序),就需要用这个关键字说明. )volatile, ...

  7. C中嵌入SQL

    连接到SAMPLE数据库,查询LASTNAME为JOHNSON的FIRSTNAME信息. #include <stdio.h> #include <stdlib.h> #inc ...

  8. CentOS 6.4 + 曙光DS200 IPSan组建FTP服务器

    CentOS 6.4 + 曙光DS200 IPSan组建FTP服务器 http://write.blog.csdn.net/postedit/10911105#本系列文章由ex_net(张建波)编写, ...

  9. PHP学习之-1.5 字符串

    字符串 一个字符串是用双引号扩起来的一个词或者一个句子,比如 "Hello Word" ,你可以使用PHP语言输入这个字符串,像这样 <?php echo "Hel ...

  10. spring mvc MultipartFile 上传文件错误解决

    Field error in object 'xxxx' on field 'xxxx': rejected value [20129259128131.jpg]; codes [typeMismat ...