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

八皇后:

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

图示:

  

我的解决方案:

  网上有大量的方法,大部分抽象难以理解,并且有知乎大神整理出了10行代码的版本,一时间惊为天人,众人错愕。如何用 C++ 在 10 行内写出八皇后?你如果看得懂各路大神装的逼,可以关闭本文章了。

  

  现在给出我的个人版本,算法过程描述的比较详细,并且加入了大量注释,尤其是流程控制方面的注解比较多,方便理解。算法核心部分是基于已定位置的未知位置计算。本次实现方式并非是效率最高的方式,但是对于刚刚接触这个算法,而又整理不出思路的人来说,很有帮助。

结果如图:

  

  

源码如下:八皇后

时间: 2024-08-10 23:30:45

八皇后算法的另一种实现(c#版本)的相关文章

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

看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 def table(m, lst): '''绘制m列的棋盘,每行有个皇后旗子''' head = '┌' + '─┬' * (m-1) + '─┐' row = lambda x: '│' + ' │' * x + '╳│' + ' │' * (m - x - 1) trow = '├' + '─

八皇后算法

#include<iostream> using namespace std; #define MAX 8 int queen[MAX]={0}; int sum = 0; void show() { printf("("); for(int i =0;i<MAX;i++) { printf(" %d",queen[i]); } printf(")\n"); sum++; } int place(int n) { for(int

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

循环方式: package EightQueens; public class EightQueensNotRecursive { private static final boolean AVAILABLE = true; private int squares = 8, norm = squares - 1; private int positionInRow[] = new int[squares]; private int p=-1; private boolean[] rows = n

20150410 递归实现八皇后问题

20150410 递归实现八皇后问题 2015-04-10 Lover雪儿 十九世纪著名的数学家高斯1850年提出: 在8x8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意的连个皇后都不能处于同一行.同一列或者统一斜线,问有多少种摆法. 以下是其中一种解法,如图所示: 当年高斯先生没日没夜的计算,得出结论是76种. 其实正确的结论是92中,此处我们就来编程计算一下正确的答案. 1 //八皇后问题 2 #include <stdio.h> 3 4 static int count = 0;

用递归和回溯法实现八皇后问题

问题描述: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋棋盘上放置八个皇后,使得任意两个皇后不能互相攻击,即任何行.列或对角线(与水平轴夹角为45°或135°的斜线)上不得有两个或两个以上的皇后.对于这个问题数学家高斯认为有76种方案.1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果.计算机发明后,有多种计算机语言可以解决此问题. 问题分析 在这里我们可以声明一个

2、八皇后问题——回溯法

/** * */ package unit1; /** * @author * @version 创建时间:2015-10-30 下午02:55:24 类说明 */ public class EightQueensNotRecursive { private static final boolean AVAILABLE = true; private int squares = 16, norm = squares - 1; private int positionInRow[] = new i

递归的应用——八皇后问题

回朔算法的基本思想 ·从问题的某一种状态出发,搜索可以到达的状态 ·当某个状态到达后,可向前回退,并继续搜索其他可达状态 ·当所有状态都到达后,回朔算法结束 程序设计中可以利用函数的活动对象保存回朔算法的状态数据,因此可以利用递归完成回朔算法. 八皇后算法 1 初始化 I = 1 2 初始化 J = 1 3 从第i行开始,恢复j的当前值,判断第j个位置 A`位置j可放入皇后:标记位置(i,j),i++,转步骤2 B`位置j不可以放入皇后:j++,转至步骤A C`当j>8时,i--,转至步骤3 4

Lua实现的八皇后问题

来自<Lua程序与设计>第二节- 八皇后问题 输出所有解的解法 书中提供的源代码,加注了自己的注释. N = 8 --[[ N为棋盘规模 a为一维数组,保存第i个皇后所在的列数 ]] -- 检查是否可以将第n个皇后放在第n行第c列(前n-1行的皇后已经放好) function isplaceok(a,n,c) -- 检查前n-1个皇后是否与(n,c)位置冲突 for i = 1, n - 1, 1 do if a[i] == c or -- 是否同一列 a[i] - i == c - n or

回溯算法解八皇后问题(java版)

八皇后问题是学习回溯算法时不得不提的一个问题,用回溯算法解决该问题逻辑比较简单. 下面用java版的回溯算法来解决八皇后问题. 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列.直到所有皇后都放完,或者放哪