import java.util.Date;
public class Queen {
private final int size;//棋盘的大小,也表示皇后的数目
private int[] location;//皇后在棋盘的每行上的列的位置
private int[] colsOccupied;//皇后在棋盘上占据的列
private int[] cross1Occupied;//皇后在棋盘上占据的正对角线
private int[] cross2Occupied;//皇后在棋盘上占据的反对角线
private static int count;//解决方案的个数
private static final int STATUS_OCCUPIED = 1;//占领状态
private static final int STATUS_OCCUPY_CANCELED = 0;//未占领状态
public Queen(int size){
this.size = size;
location = new int[size];
colsOccupied = new int[size];
cross1Occupied = new int[2*size-1];
cross2Occupied = new int[2*size-1];
}
private void printLocation(){
System.out.println("以下是皇后在棋盘上的第"+count+"种摆放位置");
for(int i = 0; i < size; i++){
System.out.println("行:"+i+"列:"+location[i]);
}
}
/**
* 判断位置(i,j)是否被占领
*/
private boolean isOccupied(int i,int j){
return colsOccupied[j]==0&&cross1Occupied[i-j+size-1]==0&&cross2Occupied[i+j]==0;
}
/**
* 设置占领标识
*/
private void setStatus(int i,int j,int flag){
colsOccupied[j] = flag;//宣布占领或取消占领第j列
cross1Occupied[i-j+size-1] = flag;//宣布占领或取消占领正对角线
cross2Occupied[i+j] = flag;//宣布占领或取消占领反对角线
}
/**
* 从第i行开始放置皇后
*/
private void place(int i){
for(int j = 0; j < size ; j++)//在第i行,分别尝试把皇后放在每一列上
if(isOccupied(i,j)){//判断该位置是否被占领
location[i] = j;//摆放皇后,在第i行把皇后放在第j列
setStatus(i,j,STATUS_OCCUPIED);//宣布占领位置(i,j)
if(i < size-1)
place(i+1);//如果所有皇后没有摆完,递归摆放下一行的皇后
else{
count++;//统计解决方案的个数
printLocation();//完成任务,打印所有皇后的位置
}
setStatus(i, j, STATUS_OCCUPY_CANCELED);//撤销占领位置(i,j)
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
long start = new Date().getTime();
new Queen(5).place(0);
System.out.println("一共找到 "+count+" 种摆放方案");
long end = new Date().getTime();
System.out.println("一共耗时 "+(end-start)+" ms");
}
}
/**
分析:数组int[2*size-1]大小为什么是(2*size-1),为什么判断cross1Occupied[i-j+size-1] == 1与cross2Occupied[i+j] == 1
一种对角线情况如下:
参考点为([row][col]),则与参考点在同一斜线(对角线)的坐标为([row+1][col-1])、([row-1][col+1])、([row-2][col+2])等等
发现规律,横纵座标之和相等。 均为 row+col,由此可以保证该斜线上只能有一个皇后
继续考虑 row+col 之和的大小,取两种极限情况:即int[0][0]与int[size-1][size-1]
不难判断 row+col 之和应该是 0~2*(size-1),即数组长度应该为 (2*size-1)
因为还有一个0,所以为 2*(size-1) + 1 = (2*size-1)
并且判断cross2Occupied[i+j]==1
(因为想在([i][j])位置上放置皇后,所以需要判断与([i][j])点在同一斜线的所有点是否有皇后)
另一种对角线情况如下:
参考点为([row][col]),则与参考点在另外同一斜线(对角线)的坐标为([row+1][col+1])、([row-1][col-1])、([row-2][col-2])等等
发现规律,横纵座标之差相等。 均为 row-col,由此可以保证该斜线上只能有一个皇后
继续考虑 row-col 之差的大小,取两种极限情况:即int[0][size-1]与int[size-1][0]
差值最小为 0-(size-1) = -size+1 差值最大为 size-1-0=size-1
数组个数 (size-1) - (-size+1) = 2*size-2,因为还有一个0,所以为 2*size-2 + 1 = (2*size-1)
row-col 作为数组下标,因此不能为负数。cross1Occupied[i-j]的下标为负数(-size+1),所以cross1Occupied
数组应该写成 [i-j+size-1],以保证下标从0开始,并且判断cross1Occupied[i-j+size-1] == 1
(因为想在([i][j])位置上放置皇后,所以需要判断与([i][j])点在另一同一斜线的所有点是否有皇后)
*/
分享到:
相关推荐
八皇后问题是一个经典的问题,在计算机科学和算法设计中占有重要...在分析提供的压缩包文件“2010302580132_软1_朱静_Task3”中的代码,我们可以深入探讨这些概念的具体实现,进一步巩固对八皇后问题及其解法的理解。
利用回溯法解决8皇后问题,简单并且和很好理解!
在8皇后问题中,n的值为8,即在8×8的棋盘上放置8个皇后。 **1. 回溯法** 回溯法是一种试探性的解决问题的方法,它尝试逐步构建解决方案,如果在某一步发现当前路径无法到达目标状态,则退回一步,尝试其他路径。在...
本项目名为“python+pygame实现可视化8皇后问题/N皇后问题”,其中包含的文件如下: 1. **结果演示.mp4**:这是一个视频文件,展示了使用Python和Pygame实现的N皇后问题的运行效果。通过动态演示,用户可以看到皇后...
在C#中实现8皇后问题,我们需要理解基本的编程概念、数组操作以及如何运用回溯策略来解决问题。 首先,我们创建一个二维数组表示棋盘,用0代表空位,1代表有皇后的位置。棋盘大小为8x8,因此我们定义一个8x8的数组...
8皇后问题是一个经典的计算机算法问题,其目标是在一个8×8的棋盘上摆放8个皇后,使得任意两个皇后都不会处于同一行、同一列或同一对角线上。这个问题的解决方案通常采用回溯法来实现,因为它的解决方案具有高度的...
5皇后问题是一个经典的回溯算法实例,它要求在8x8的棋盘上放置5个皇后,使得任意两个皇后都不能在同一行、同一列或同一条对角线上。这是一个典型的排列问题,因为皇后的位置是唯一的,每个皇后占据棋盘的一个格子。...
**八数码问题(8皇后问题)** 八数码问题,又称为8皇后问题,是一个经典的回溯法和搜索算法的应用实例。在这个问题中,目标是在...理解这些算法及其在8皇后问题上的应用,有助于提升对搜索算法和组合优化问题的理解。
首先,我们要理解八皇后问题的核心:在8x8的棋盘上放置8个皇后,使得任意两个皇后都无法在同一行、同一列或同一对角线上攻击彼此。这是一个典型的约束满足问题,通常用回溯法求解。回溯法是一种试探性的解决问题的...
本次实验的主要目的是让学生通过实际编程操作,深入理解并解决N皇后问题。实验要求包括以下几点: 1. **了解皇后相互攻击的条件**:当两个皇后位于同一行、同一列或者同一对角线上时,它们就会相互攻击。这是解决N...
#define QUEENS 8 //定义要解决的数量,典型的问题为8个皇后 void printResult(); //用来输出解的结果 int isCanPlace(int i, int j); //用来判断一个位置是否能够放置一个皇后 void markPlace(int i, int j); //...
以八皇后问题为例,即在8×8的棋盘上放置8个皇后,找出所有可能的解决方案。这个问题有助于理解回溯算法和递归思想在编程中的应用。 **一、问题定义** 1. **棋盘结构**:n皇后问题是在一个n×n的棋盘上进行,每个...
### 8皇后问题的两种解法(C语言描述) #### 方法一:回溯法 **回溯法**是一种通过尝试解决子问题,并且能够“撤销”答案的算法。8皇后问题是一个经典的计算机科学问题,其目标是在一个8×8的棋盘上放置8个皇后,...
禁忌搜索是一种优化算法,常用于解决复杂的问题,如排列、组合优化、旅行商问题和8皇后问题等。这种算法借鉴了人类记忆经验的原理,避免在解决问题时重复探索已知无效或低效的解决方案,从而提高搜索效率。8皇后问题...
### 8皇后问题详解 #### 一、问题背景与定义 8皇后问题是一个经典的问题,在计算机科学领域中常被用来作为回溯法(Backtracking)的示例。该问题最初由国际象棋爱好者马克斯·贝瑟尔在1848年提出,要求在一个8×8...
总结来说,八皇后问题是一个展示回溯算法和逻辑思维能力的经典问题,通过C++编程实现,可以加深对算法理解,提高问题解决能力。无论是在学术研究还是在实际开发中,这类问题的解决方法都能为计算机科学家和工程师...
数据结构八皇后问题实验报告是一份详尽的项目...总的来说,这份实验报告详细展示了如何使用C语言和数据结构解决八皇后问题,从需求分析到具体实现,提供了完整的思路和代码示例,对于理解和学习这个问题非常有帮助。
### Prolog语言解决8皇后问题源程序解析 ...8皇后问题的实现不仅展示了Prolog语言的强大能力,还提供了一个理解递归和逻辑编程的好例子。此外,这种简洁的代码风格和明确的逻辑结构使得代码易于理解和维护。
首先,我们要理解八皇后问题的解决方案在于如何有效地进行排列和检查。在8x8的棋盘上,每个位置可以看作一个坐标 (x, y),其中 x 和 y 分别为行和列的索引。我们的目标是找到所有可行的放置方式,使得每行、每列以及...
8皇后问题JAVA算法 用递归实现,程序种有两种判定皇后可放的方法 一种采用辅助数组,一种采用斜率判断 代码比较简洁,对递归的理解和掌握有帮助 测试结果: 1 :1 5 8 6 3 7 2 4 2 :1 6 8 3 7 4 2 5 3 :1 7 4 6 8 2 ...