受伤的皇后(八皇后问题)
题目描述
有一个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;}}}
}
受伤的皇后(八皇后问题)相关推荐
- 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 ...
- C语言编程统计八皇后问题的解的个数,八皇后问题C语言解法
偶遇八皇后问题,随即自己写了一个仅供参考 #include #include #define SIZE 8 void Circumsribe(int(*checkerboard)[SIZE], int ...
- 【数据结构算法】递归:八皇后问题
八皇后 八皇后问题就是说如下图所示的国际象棋的棋盘中,放入8个皇后,所谓皇后就是国际象棋中的一个角色,它的功能就是能够打掉与它同一行同一列同一斜排的棋子,并且打击距离是整个棋盘.我们的任务就是在棋盘中 ...
- C语言局部搜索算法(爬山法,模拟退火法,遗传算法)求解八皇后问题
C语言局部算法求解八皇后问题 写在前面 八皇后问题及局部搜索算法 爬山法(hill-climbing searching) 算法介绍 代码实现 退火法(simulated annealing) 算法介 ...
- 递归/回溯:八皇后问题N-Queens
N皇后问题是计算机科学中最为经典的问题之一,该问题可追溯到1848年,由国 际西洋棋棋手马克斯·贝瑟尔于提出了8皇后问题. 将N个皇后放摆放在N*N的棋盘中,互相不可攻击,有多少种摆放方式,每种摆 放 ...
- 八皇后的一个回溯递归解法
解法来自严蔚敏的数据结构与算法. 代码如下: #include <iostream> using namespace std; const int N = 8;//皇后数 int coun ...
- Prolog学习:数独和八皇后问题
上一篇简单介绍了下Prolog的一些基本概念,今天我们来利用这些基本概念解决两个问题:数独和八皇后问题. 数独 数独是一个很经典的游戏: 玩家需要根据n×n盘面上的已知数字,推理出所有剩余空格的数字, ...
- 带你轻而易举的学习python——八皇后问题
首先我们来看一下这个著名的八皇后问题 八皇后问题:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 在这个问题提出之后人们又将 ...
- 漫画:什么是八皇后问题?
本文经授权转载自公众号程序员小灰 (ID:chengxuyuanxiaohui) ----- 第二天 ----- 题目是什么意思呢? 国际象棋中的皇后,可以横向.纵向.斜向移动.如何在一个8X8的 ...
最新文章
- python 多级递归_Python文件目录和系统操作,os模块和os.path模块
- linux centos php5.3 安装curl扩展
- 2013-07-22 IT 要闻速记快想
- C++之map插入数据相同的key不能覆盖value解决办法
- mac系统如何进入系统偏好设置_MacOS Big Sur 系统偏好设置无法解锁Bug解决
- 为什么只有奇次谐波_治理变频器产生谐波的应用
- InfoPath 发布表单到SharePoint库报错
- [转载] python仿真入门_python基础-入门
- 闭合导线平差计算(表面)
- JMeter之接口测试脚本编写
- 实施Scrum敏捷开发的关键要素
- 程序员常用英文名参考
- qq街景输入 dir-item.js
- 计算机分辨率无法调整,教你电脑分辨率调不过来怎么办
- 安装opencv时出现PEP517问题解决
- java网络编程(网络通信)
- ArcGIS API for JavaScript学习笔记(1)API本地部署
- 《图说VR入门》——googleVR 他山之玉
- java中cache是什么_java中的cache机制
- 这10个小技巧,让你的Python数据分析加速50%!