八皇后问题详细分析与解答(递归法解答,c#语言描述)
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯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#语言描述)的更多相关文章
- 归并排序,递归法,C语言实现。
利用归并排序法对序列排序的示意图(递归法): 一.算法分析:利用递归的分治方法:1.将原序列细分,直到成为单个元素:2.在将分割后的序列一层一层地按顺序合并,完成排序.细分通过不断深入递归完成,合并通 ...
- java递归求八皇后问题解法
八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...
- LeetCode 回溯法 别人的小结 八皇后 递归
#include <iostream> #include <algorithm> #include <iterator> #include <vector&g ...
- 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)
本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...
- 八皇后问题-dfs
一.题意解析 国际象棋中的皇后,可以横向.纵向.斜向移动.如何在一个8X8的棋盘上放置8个皇后,使得任意两个皇后都不在同一条横线.竖线.斜线方向上?八皇后问题是一个古老的问题,于1848年由一位国际象 ...
- 一道算法题-八皇后问题(C++实现)
八皇后问题 一.题意解析 国际象棋中的皇后,可以横向.纵向.斜向移动.如何在一个8X8的棋盘上放置8个皇后,使得任意两个皇后都不在同一条横线.竖线.斜线方向上?八皇后问题是一个古老的问题,于1848年 ...
- 八皇后问题 递归实现 C语言 超详细 思路 基础
八皇后问题 :假设 將八个皇后放到国际象棋盘上,使其两两之间无法相互攻击.共有几种摆法? 基础知识: 国际象棋里,棋盘为8X8格. 皇后每步可以沿直线.斜线 走任意格. 思路: 1.想把8个皇后放进去 ...
- 7, java数据结构和算法: 八皇后问题分析和实现 , 递归回溯
什么是八皇后问题: 指的是,在一个8 * 8的棋盘中, 放置8个棋子, 保证这8个棋子相互之间, 不在同一行,同一列,同一斜线, 共有多少种摆法? 游戏连接: http://www.4399.com/ ...
- LeetCode 31:递归、回溯、八皇后、全排列一篇文章全讲清楚
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天我们讲的是LeetCode的31题,这是一道非常经典的问题,经常会在面试当中遇到.在今天的文章当中除了关于题目的分析和解答之外,我们还会 ...
随机推荐
- Linux fstab 参数详解
[root@qs-wg-db1 /]# cat /etc/fstab LABEL=/ / ext3 defaults ...
- java Native 方法
一. 什么是Native Method 简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非j ...
- Qt同步线程(比较清楚,而且QMutex QMutexLocker QReadWriteLock QSemaphore QWaitCondition 每个都有例子)
Qt同步线程 我们知道,多线程有的时候是很有用的,但是在访问一些公共的资源或者数据时,需要进行同步,否则会使数据遭到破坏或者获取的值不正确.Qt提供了一些类来实现线程的同步,如QMutex,QMute ...
- boost 分析命令行参数
#include <boost/program_options.hpp> #include <iostream> #include <vector> using n ...
- 第14周 项目三-OOP版电子词典
做一个简单的电子词典.在文件dictionary.txt中,保存的是英汉对比的一个词典,词汇量近8000个,英文.中文释义与词性间用'\t'隔开. (1)编程序,由用户输入英文词.显示词性和中文释义. ...
- PHP - 创建一个类
/* * 类的实现 */ //声明一个类 class Person { //私有字段 private $name; private $sex; private $age; //构造函数 functio ...
- CEGUI 输入法窗口实现
游戏中经常要输入汉字,但当我们游戏没有自己实现输入法窗口时,windows会使用用户安装的输入法,但这个输入法窗口只会显示在游戏窗口外头,而且当我们游戏全屏时(真全屏,不是那种窗口式的假全屏),屏幕上 ...
- Python学习笔记 — 函数
函数是对程序逻辑进行结构化或过程化的一种编程方法.函数具有两个方面的意义:1)将代码分块,易于管理和阅读:2)最大化代码复用和最小化代码冗余,节省空间,有助于保持一致性. 1. 函数定义 Python ...
- VM中装Linux换ISO文件报错"该光盘无法被挂载"
一.发现问题 利用VM安装Red Hat Linux的时候,第一个iso安装完毕,准备换第二个iso,报错“该光盘无法被挂载”. 二.解决办法 上面的菜单栏中“虚拟机”—>“设置”—>“硬 ...
- Delphi反射
最近在写一个框架,需要用到反射,与C# java这些原生支持反射的语言不同,delphi对反射的支持相对要弱一些,但也够用了,其实C#的大部分的思想还是从 delphi而来,毕竟都是安德鲁斯的杰作. ...