引言
由于大学课堂中数据结构中并没有讲一些常见的算法,只是讲的比较简单的定义。所以拿出来暑假时间去研究经典的算法。本文章是研究的八皇后问题。八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。
思路
之前听到过很多次“八皇后问题”,但是都没有仔细研究(好吧,我承认智商不够,精力不足),这次仔细研究了这个问题。首先结合递归的定义,可以分解成相似结构的相同小问题,而这个题因为 每一行 每一列只能能有一个皇后,所以8行可以分解为7行,7行可以分解为6行 ……。这样我们从第一个行开始,如果符合条件,递归调用(raw+1,n,chess);如果raw能到8,则说明是符合的,则打印出来。
说起来比较抽象,上代码看一下:

C语言描述

//山东科技大学小昝
#include <stdio.h>
#include <math.h>
//count 记录一共有多少种符合情况。
int count = 0;int notDanger(int row,int column,int (*chess)[8]){int i,j;for(i=0;i<row;i++){for(j=0;j<8;j++){if(chess[i][j]==1){if(j == column){return 0;}if(abs(i-row) == abs(j-column)){return 0;}}}}return 1;
}
void EightQueen(int row ,int n ,int (*chess)[8]){int i,j,chess2[8][8];for(i=0;i<8;i++){for(j=0;j<8;j++){chess2[i][j] = chess[i][j];}}if(row == 8){printf("第 %d 次\n",count+1);for( i = 0;i <8;i++){for( j =0 ;j<8;j++){printf("%d ",*(*(chess2+i)+j));}printf("\n");}printf("\n");count++;}else{for(i = 0;i<n;i++){if(notDanger(row,i,chess)){for(j = 0;j<8;j++){*(*(chess2+row)+j)=0;}*(*(chess2+row)+i)=1;EightQueen(row+1,n,chess2);}}}}int main(){int chess[8][8],i,j;for(i=0;i<8;i++){for(j=0;j<8;j++){chess[i][j]=0;}}EightQueen(0,8,chess);printf("一共 %d 种情况!\n",count);return 0;
}

JAVA描述

package alizantest;
//山东科技大学小昝
public class EightQueen {static int count = 0;private static boolean notdanger(int row, int column, int[][] chess) {// TODO Auto-generated method stubint i, j;for (i = 0; i < row; i++) {for (j = 0; j < 8; j++) {if (chess[i][j] == 1) {if (j == column) {return false;}if (Math.abs(row - i) == Math.abs(column - j)) {return false;}}}}return true;}private static void EightQueen(int row, int column, int[][] chess) {int i, j;int[][] chess2 = new int[8][8];for (i = 0; i < 8; i++) {for (j = 0; j < 8; j++) {chess2[i][j] = chess[i][j];}}if (row == 8) {System.out.println("第" + count + 1 + "个");for (i = 0; i < 8; i++) {for (j = 0; j < 8; j++) {System.out.print(chess2[i][j] + " ");}System.out.println();}System.out.println();count++;} else {for (i = 0; i < column; i++) {if (notdanger(row, i, chess)) {for (j = 0; j < 8; j++) {chess2[row][j] = 0;}chess2[row][i] = 1;EightQueen(row + 1, column, chess2);}}}}public static void main(String[] args) {int[][] chess = new int[8][8];int i, j;for (i = 0; i < 8; i++) {for (j = 0; j < 8; j++) {chess[i][j] = 0;}}EightQueen(0, 8, chess);System.out.println("一共有" + count + "种");}}

在用java写八皇后的时候犯得一个大的错误,导致费了半小时调试出来的。就是混用了chess与chess2,导致结果不对。所以,我们做事的时候要细心,一定细心!
八皇后问题比较抽象,是经典的算法,多多思考。希望有一天我们都能把递归算法用的炉火存青!

递归解决八皇后问题-小昝相关推荐

  1. 有趣的数据结构算法12——利用递归解决八皇后问题

    有趣的数据结构算法12--利用递归解决八皇后问题 题目复述 解题思路 实现代码 GITHUB下载连接 本次教程主要讲述如何利用递归解决八皇后问题,它和汉诺塔一样让人很难过. 题目复述 据说西洋棋手都具 ...

  2. C语言递归解决八皇后问题

    八皇后问题,任意两个皇后都不能处于同一行.同一列或同一斜线上. 在8x8的格子上,我们可以约定每一个皇后都占一行,这样就不会出现行冲突.任何在一次将一个皇后放在一列上,判断是否与前面的皇后有冲突,直到 ...

  3. 人工智能实现a*算法解决八数码_小白带你学回溯算法

    微信公众号:小白算法 关注可了解更多算法,并能领取免费资料.问题或建议,请公众号留言;小白算法,简单白话算法,每个人都能看懂的算法 上一期算法回顾--贪婪法:https://mp.weixin.qq. ...

  4. 回溯法在解决八皇后问题中的应用

    回溯法:有这样一类题目,它们要求在相对问题的输入规模按照指数速度增长(或者更快)的域中,找出一个具有指定特性的元素.例如:在图顶点的所有排列中求一个哈密顿回路,在背包问题的一个实例中求其中最有价值的物 ...

  5. 遗传算法解决八皇后问题(java源码)

    本文源码下载链接:https://download.csdn.net/download/goulvjiang3176/11221063 另有贪心算法解决八皇后问题的源码下载链接:https://dow ...

  6. 运用全排列的方法解决八皇后问题

    运用全排列的方法解决八皇后问题,可以分为两部分:全排列和八皇后,下面我将分开说明两个步骤. 首先说明八皇后: 第一步:就是把皇后按照0到8编号,然后对八个皇后进行全排列,一共有40320种排列方式. ...

  7. 递归实现八皇后并生成皇后位置图

    记录一下解决八皇后问题的代码 1.枚举类型 #include<string> #include<iostream> using namespace std; static in ...

  8. 回溯算法解决八皇后问题(JAVA实现)

    送给程序猿们一句话 <拥有水滴石穿的坚持:懂得聚沙成塔的积累:磨练坚韧不拔的意志:学习脚踏实地的奋斗:提升立世做人的技巧:突破自我设限的障碍.> 文章目录 背景 问题解决 思路 什么是回溯 ...

  9. 用lua解决八皇后问题

        要解决八皇后问题,首先必须认识到每一行中只能有一个皇后.因此,可以用一个由8个数字组成的简单数组来表示可能的解决方案.例如,数组{3,7,2,1,8,6,5,4}表示皇后在棋盘中的位置分别是( ...

最新文章

  1. 中国地图_铜板画地图铜地球仪高档办公室装饰用品定制铜版画地图中国地图世界地图定制惠风堂铜雕艺术...
  2. 马斯克为了解决堵车挖的隧道,已经堵上了
  3. 说说如何搭建 Nginx 反向代理 Tomcat
  4. [蓝桥杯][2017年第八届真题]小计算器(模拟)
  5. Struts+DAO框架搭建完成!(源码)
  6. VMware客户端vSphereClient新建虚拟机
  7. Oracle学习 第18天 .NET连接Oracle
  8. SAP成都研究院飞机哥:程序猿和飞机的不解之缘
  9. html内编写vbs,HTML_VBS编程教程 (第2篇),第二篇: 我真没想到, - phpStudy
  10. Deepin Linux下编译并运行Proxmark3
  11. 浦发银行面试笔试经历
  12. pandas 取某一列数据的几种形式比较
  13. 什么是设计模式,为什么要使用?
  14. 求最小公倍数c语言最简公式,C语言求最小公倍数和最大公约数三种算法(经典)...
  15. J_101.Java工程Properties配置文件注释中文,会自动转换为其他编码方式问题解决
  16. 苹果首家直营店落户北京三里屯 或为iPhone铺路
  17. 服务器虚拟机6的安装教程,VMware vCenter 6.7 安装过程(图文教程)
  18. 在docker下进行ETH并行训练和在本机下进行ETH并行训练
  19. 抽象单例:一种通用的单例
  20. 什么的发明使研制着能够成功研制微型计算机,1_1_科普知识竞赛试题(小学)

热门文章

  1. 这几个 Python 的小技巧,你会么?
  2. 如何使用 OpenCV Python 检测颜色
  3. 1024 程序员节专题论坛来袭,权威解读 MindSpore、CANN 5.0 特性和 HCIA MDC 开发者认证...
  4. 平头哥玄铁处理器Linux新版本,5大亮点速览
  5. 从YARN迁移到k8s,滴滴机器学习平台二次开发是这样做的
  6. 自动驾驶关键环节:行人的行为意图建模和预测(上)
  7. 学会这门编程知识,可能决定你能进什么样的企业
  8. 速度超Mask RCNN四倍,仅在单个GPU训练的实时实例分割算法 | 技术头条
  9. 有人问你如何掌握隐含狄利克雷分布(LDA),把这篇文章甩给他
  10. 资源 | 做一款炫酷的机器人需要哪些学习资源(机器人资源Awesome系列)