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

分析:
其实该问题并不难,利用递归方法很容易解决。没放置一个皇后,就将其能够攻击的区域进行标记,然后放置下一个皇后,一次类推……;此外,如果有解最终肯定是每一行有且只有一位皇后,所以放置的时候按照逐行放置的顺序进行。此问题难点在于如何把控递归函数的返回条件,一种条件是8个皇后放置完成后,返回成功,一种条件是该行中已经没有可以放置的位置,此时返回失败,需要重新放置。此时要额外注意,所谓的“重新放置”指的并不是将所有皇后清除重新来过,而是只返回上一层,将上一个导致本次放置失败的皇后进行清除,然后重新更新其位置,通过逐级放置、或逐级回溯可以达到遍历所有情况找到所有解

class Demo{int count=0;//全局计数变量int QUEEN_NUM=8;int label[QUEEN_NUM][QUEEN_NUM]={{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0}};//n皇后个数,c已经放置的皇后个数public boolean EightQueen(int n,int c){//static int count=0;//小于3x3的棋盘是无解的if(n<4) return false;for(int i=0;i<n;++i){if(label[c-1][i]==0)//存在可以放置第c个皇后的位置{label[c-1][i]=c+1;if(c==n)/*已经放置完毕所有的皇后*/{++count;ClearChessBox(c-1,i,c+1);return true;}FillChessbox(c-1,i,c+1);EightQueen(n,c+1);ClearChessBox(c-1,i,c+1);//   现场恢复,无论下一个皇后是否顺利放置,都应该恢复现场。原因是//  如果下一个皇后放置失败,那么自然应该将本次放置的皇后去除,重新放置,所以需要进行现场恢复(即回溯);//  如果下一个皇后放置成功,意味着本次放置已经满足条件,是一个解,此时需要恢复现场,进行下一次的重新放置,寻找下一个解。}}return false;}public void FillChessbox(int m,int n,int num){for(int i=0;i<QUEEN_NUM;++i)for(int j=0;j<QUEEN_NUM;++j)if(abs(i-m)==abs(j-n))//对角区域填充{if(label[i][j]==0)label[i][j]=num;}int i=0,j=0;while(i<QUEEN_NUM)//行填充{if(label[i][n]==0)label[i][n]=num;++i;}while(j<QUEEN_NUM)//列填充{if(label[m][j]==0)  label[m][j]=num;++j;}}public void ClearChessBox(int m,int n,int num){for(int i=0;i<QUEEN_NUM;++i)for(int j=0;j<QUEEN_NUM;++j)if(abs(i-m)==abs(j-n) && label[i][j]==num)label[i][j]=0;int i=0,j=0;while(i<QUEEN_NUM){if(label[i][n]==num)label[i][n]=0;++i;}while(j<QUEEN_NUM){if(label[m][j]==num)label[m][j]=0;++j;}}public void AllClear(){for(int i=0;i<QUEEN_NUM;++i)for(int j=0;j<QUEEN_NUM;++j)label[i][j]=0;}
}

八皇后问题(回溯问题)相关推荐

  1. Bailian2754 八皇后【回溯】

    2754:八皇后 总时间限制: 1000ms 内存限制: 65536kB 描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格) ...

  2. Bailian2698 八皇后【回溯】

    2698:八皇后问题 总时间限制: 10000ms 内存限制: 65536kB 描述 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方. 输入 无输入. 输出 按给定顺序和格式输出所有 ...

  3. [C语言]八皇后问题回溯算法

    八皇后问题:在8×8格的国际象棋上摆放八个皇后,任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 将棋盘抽象为4 * 4到20 * 20大小的矩阵 输入样例: 请输入棋盘的大小(4 ...

  4. PHP实现八皇后算法-回溯算法

    回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯"返回,尝试别的路径.回溯法是一种选优搜索法,按选优条件向前搜索,以 ...

  5. java递归-八皇后问题(回溯算法)

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

  6. 八皇后问题 回溯法hdu2553

    N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  7. 八皇后问题---回溯

    package com.atguigu.recursion;/*** @创建人 wdl* @创建时间 2021/3/21* @描述*/ public class Queue8 {//先定义一个max表 ...

  8. leetcode面试题 08.12. 八皇后(回溯)

    设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行.不同列,也不在对角线上.这里的"对角线"指的是所有的对角线,不只是平分整个棋盘的那两条对角线. ...

  9. 八皇后问题 回溯方法

    #include<iostream> using namespace std;//当前检测的行列 是否 符合条件 //从1行1列开始 bool check(int row,int col, ...

  10. 回溯算法 | 追忆那些年曾难倒我们的八皇后问题

    文章收录在公众号:bigsai 更多精彩干货敬请关注! 前言 说起八皇后问题,它是一道回溯算法类的经典问题,也可能是我们大部分人在上数据结构或者算法课上遇到过的最难的一道题-- 第一次遇到它的时候应该 ...

最新文章

  1. 用泛型方法Java从实体中提取属性值,以及在泛型方法中的使用
  2. SAP MM 公司间STO的BILLING输出报错 - Inbound partner profile does not exist –
  3. 美军认知技术发展态势
  4. 准确率(Precision)、召回率(Recall)以及综合评价指标(F1-Measure )
  5. 区域填充与击中击不中变换
  6. 解决IOS ATS禁止HTTP明文传输
  7. CGI模式,模块模式与CLI模式运行PHP的区别
  8. JS 键盘监听事件 enter 13
  9. 适用于JDeveloper 11gR2的Glassfish插件
  10. 判断文件是否改变php,PHP判断文件是否被修改实例
  11. MySQL的多表查询(笛卡尔积原理)
  12. jq使用教程02_安装的问题
  13. Unity3D 中实现毛笔效果
  14. linux常用桌面有两种,推荐!5款Linux常用桌面环境
  15. Android补间动画使用
  16. 将HEX文件通过Keil软件进行下载
  17. C#工业物联网和集成系统解决方案的技术路线(数据源、数据采集、数据上传与接收、ActiveMQ、Mongodb、WebApi、手机App)
  18. 从高级程序员-资深程序员-技术总监,我都为你整理好了学习路径
  19. 删除MySQL历史数据并修改sqlsource.status lastindex脚本
  20. Unity3d绑定键盘弹出UI

热门文章

  1. 微信V3版本支付下单、查询支付订单状态、订单退款接入正式项目中并引入策略模式实操
  2. linux基础-自查
  3. 从西天取经事件看官场潜规则
  4. python输入一个包含若干自然数的列表_Python练习题
  5. 二十一世纪大学英语读写教程(第三册)学习笔记(原文)——5 - America Seen with European Eyes(概说美国——欧洲人眼中的美国)
  6. 大数据运维架构师培训(5):大数据管理平台(Cloudera CM/CDH/CDP)
  7. 【其他】bilibili下载的m4s格式视频如何还原为mp4
  8. 快速实现M5311 NBIOT TCP通信
  9. Arduino NBIoT使用方法一
  10. python游戏制作rpg_2. Molten从零开始做独立游戏-引擎选用