题目描述
有一个n×n 的国际象棋棋盘(nn 行 nn 列的方格图),请在棋盘中摆放 nn 个受伤的国际象棋皇后,要求:

任何两个皇后不在同一行。
任何两个皇后不在同一列。
如果两个皇后在同一条 45 度角的斜线上,这两个皇后之间行号的差值至少为 3 。
请问一共有多少种摆放方案。

输入输出样例
示例 1
输入
4
输出
2
思路分析:此题类似于八皇后问题,在了解八皇后的基础做此题可以简单一些,只需要将八皇后问题的第一种解法中的check()函数中对于左斜列,又斜列添加判断条件既可,因为题目中提示(如果两个皇后在同一条 45 度角的斜线上,这两个皇后之间行号的差值至少为 3 。)据此修改check()条件就可满足条件。
八皇后问题:八皇后问题题解

//未修改前的check()判断代码,八皇后问题
//检查每一列,每一斜列是否有元素static boolean check(int r, int i) {//检查每一列for (int j = 1; j <= 8; j++) {if (a[j][i] == 1) return false;}for (int j = 1; j <= 8; j++) {for (int z = 1; z <= 8; z++) {if (j - z == r - i && a[j][z] == 1)return false;}}for (int j = 1; j <= 8; j++) {for (int z = 1; z <= 8; z++) {if (j + z == r + i && a[j][z] == 1)return false;}}return true;}
//修改后的check()代码,受伤的八皇后问题public static boolean check(int x,int y){//判断行是否已经有棋子,有则返回falsefor(int i=1;i<=n;i++){if(a[x][i]==1)return false;}//这一列是否已经存在棋子for(int i=1;i<=n;i++){if(a[i][y]==1)return false;}//左斜列for(int i=1;i<=n;i++ ){for(int j=1;j<=n;j++){if(i-j==x-y){if(a[i][j]==1&&Math.abs(i-x)<3)//修改处,必须要取绝对值,因为在回溯时可能出现负数return false;}}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i+j==x+y){if(a[i][j]==1&&Math.abs(i-x)<3)//修改处,同上return false;}}}return true;}

import java.util.Scanner;public class Mian {static int n;static int ans=0;//统计方案个数static int a[][]=new int[12][12];public static void main(String[] args) {Scanner sc = new Scanner(System.in);n=sc.nextInt();dfs(1);System.out.println(ans);}public static boolean check(int x,int y){//判断行是否已经有棋子,有则返回falsefor(int i=1;i<=n;i++){if(a[x][i]==1)return false;}//这一列是否已经存在棋子for(int i=1;i<=n;i++){if(a[i][y]==1)return false;}//左斜列for(int i=1;i<=n;i++ ){for(int j=1;j<=n;j++){if(i-j==x-y){if(a[i][j]==1&&Math.abs(i-x)<3)return false;}}}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(i+j==x+y){if(a[i][j]==1&&Math.abs(i-x)<3)return false;}}}return true;}public static void dfs(int r){if(r>n){ans++;return;}for(int i=1;i<=n;i++){//遍历列,递归遍历行if(check(r,i)){a[r][i]=1;dfs(r+1);a[r][i]=0;}}}
}

受伤的皇后(八皇后问题)相关推荐

  1. matlab硬币覆盖问题和八皇后,八皇后问题matlab程序

    1.function y=bahuanghou();result=cell(1,8);N=100;for i=1:8resulti=1,i;end;for i=1:8for j=2:8len=leng ...

  2. C语言编程统计八皇后问题的解的个数,八皇后问题C语言解法

    偶遇八皇后问题,随即自己写了一个仅供参考 #include #include #define SIZE 8 void Circumsribe(int(*checkerboard)[SIZE], int ...

  3. 【数据结构算法】递归:八皇后问题

    八皇后 八皇后问题就是说如下图所示的国际象棋的棋盘中,放入8个皇后,所谓皇后就是国际象棋中的一个角色,它的功能就是能够打掉与它同一行同一列同一斜排的棋子,并且打击距离是整个棋盘.我们的任务就是在棋盘中 ...

  4. C语言局部搜索算法(爬山法,模拟退火法,遗传算法)求解八皇后问题

    C语言局部算法求解八皇后问题 写在前面 八皇后问题及局部搜索算法 爬山法(hill-climbing searching) 算法介绍 代码实现 退火法(simulated annealing) 算法介 ...

  5. 递归/回溯:八皇后问题N-Queens

    N皇后问题是计算机科学中最为经典的问题之一,该问题可追溯到1848年,由国 际西洋棋棋手马克斯·贝瑟尔于提出了8皇后问题. 将N个皇后放摆放在N*N的棋盘中,互相不可攻击,有多少种摆放方式,每种摆 放 ...

  6. 八皇后的一个回溯递归解法

    解法来自严蔚敏的数据结构与算法. 代码如下: #include <iostream> using namespace std; const int N = 8;//皇后数 int coun ...

  7. Prolog学习:数独和八皇后问题

    上一篇简单介绍了下Prolog的一些基本概念,今天我们来利用这些基本概念解决两个问题:数独和八皇后问题. 数独 数独是一个很经典的游戏: 玩家需要根据n×n盘面上的已知数字,推理出所有剩余空格的数字, ...

  8. 带你轻而易举的学习python——八皇后问题

    首先我们来看一下这个著名的八皇后问题 八皇后问题:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 在这个问题提出之后人们又将 ...

  9. 漫画:什么是八皇后问题?

    本文经授权转载自公众号程序员小灰 (ID:chengxuyuanxiaohui) -----  第二天  ----- 题目是什么意思呢? 国际象棋中的皇后,可以横向.纵向.斜向移动.如何在一个8X8的 ...

最新文章

  1. python 多级递归_Python文件目录和系统操作,os模块和os.path模块
  2. linux centos php5.3 安装curl扩展
  3. 2013-07-22 IT 要闻速记快想
  4. C++之map插入数据相同的key不能覆盖value解决办法
  5. mac系统如何进入系统偏好设置_MacOS Big Sur 系统偏好设置无法解锁Bug解决
  6. 为什么只有奇次谐波_治理变频器产生谐波的应用
  7. InfoPath 发布表单到SharePoint库报错
  8. [转载] python仿真入门_python基础-入门
  9. 闭合导线平差计算(表面)
  10. JMeter之接口测试脚本编写
  11. 实施Scrum敏捷开发的关键要素
  12. 程序员常用英文名参考
  13. qq街景输入 dir-item.js
  14. 计算机分辨率无法调整,教你电脑分辨率调不过来怎么办
  15. 安装opencv时出现PEP517问题解决
  16. java网络编程(网络通信)
  17. ArcGIS API for JavaScript学习笔记(1)API本地部署
  18. 《图说VR入门》——googleVR 他山之玉
  19. java中cache是什么_java中的cache机制
  20. 这10个小技巧,让你的Python数据分析加速50%!

热门文章

  1. 嵌入式状态机编程简介
  2. linux查找目录中指定文件或遍历指定文件夹
  3. 一文看懂芯片后端报告
  4. ABP理论学习之本地化
  5. oracle怎么确定安装成功,怎么判断oracle是否安装成功
  6. LVM逻辑卷的创建,扩容和删除
  7. dubbo监控中心安装
  8. 技术学校面试该说什么_我第一次现场技术面试后,香港专业教育学院学到了什么...
  9. rust巨型采矿机_【rust巨型挖掘机在哪加柴油】专区-挖掘机-铁甲网
  10. git clone时需要密码