`
qly198
  • 浏览: 14169 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

理解8皇后问题

J# 
阅读更多
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])点在另一同一斜线的所有点是否有皇后)

*/
分享到:
评论

相关推荐

    八皇后问题

    本程序可以解决著名的八皇后问题,代码简单易懂,执行过程清楚明白!

    利用回溯法解决8皇后问题

    利用回溯法解决8皇后问题,简单并且和很好理解!

    8皇后问题(数据结构C++)

    #define QUEENS 8 //定义要解决的数量,典型的问题为8个皇后 void printResult(); //用来输出解的结果 int isCanPlace(int i, int j); //用来判断一个位置是否能够放置一个皇后 void markPlace(int i, int j); //...

    8皇后算法JAVA实现

    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 ...

    遗传算法求解 遗传算法 遗传算法 遗传算法 遗传算法 遗传算法 遗传算法8皇后问题

    用简单遗传算法求解8皇后问题,每次输出一代染色体中最好和最差个体的适应度,当求的解时便将解输出,解依次为0到7行哪一列放棋子,只是简单的熟悉一下遗传算法,代码没有写注释,如果有问题与我讨论就发邮件吧,...

    zyx八皇后实验报告_附源代码_八皇后问题实验报告_

    一、实验题目:栈与递归程序设计二、实验目的:通过实验理解栈及栈的应用,特别地栈在消除递归中的应用三、实验内容:编写程序完成如下操作:1、八皇后问题。(编写没有递归的程序)注:八皇后问题说明:在8*8的棋盘...

    八皇后问题的scheme解法(queen8.scm)

    收集的用scheme语言编写的八皇后的解法,对学习scheme语言想理解递归的同志们是一个好例子,sicp中也有此练习题。

    数据结构 课程设计 八皇后问题(C语言源程序 + Word版课程设计说明书)

    八皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。 该问题是在8×8格的国际象棋棋盘上摆放8个皇后,要求没有一个皇后能够吃掉任何其他一个,也就是使其...

    8皇后的代码

    8皇后的几种解决方法的C++代码,因为很多企业招聘笔试的时候都会搬出8皇后问题来难一下笔试者,所以这里找了几个方法汇总一下,选择适合自己思维的去理解。

    n皇后排列树

    用排列树实现8皇后问题 算法主要思路 约束条件: ①不同列:x[i]!=x[k] ②不在各对角线上:abs(i-k)!=abs(x[i]-x[k]) 无限界条件 采用排列树可以去掉条件x[i]!=x[k],因为排列树结构每层结点的孩子数减1,已经...

    Python解决八皇后问题并输出可视化结果

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

    八皇后C++求解精选

    八皇后问题是一个古老而著名的问题。该问题是十九世纪著名的数学家高斯1850提出;在8×8格的国际象棋上摆放八皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯...

    java 八皇后循环递归回溯实现

    经典的八皇后问题,我看过很多解决八皇后的方法,这个是最好理解的,简单又清楚。

    C++数据抽象和问题求解(第6版).[美]Frank M. Carrano(带详细书签).pdf

    ◆ 诠释了ADT的主要应用,如查找航班图、事件驱动的模拟和八皇后问题 ◆ 大部分章节中的例子都使用了标准模板库(STL) ◆ 介绍了递归 ◆ 附录中提供了基本的C++语法,以帮助学生从其他语言转换为C++ 第1章 数据...

    《妙趣横生的算法(C语言实现)》(杨峰 编著)

    3.6.2 四皇后问题求解 3.7 数值概率算法 3.7.1 基本概念 3.7.2 计算定积分 第2部分 编程实例解析 第4章 编程基本功 4.1 字符类型统计器 4.2 计算字符的ASCII码 4.3 嵌套if.else语句的妙用 4.4 基于switch语句的译码...

    人工智能在保险业的应用与挑战.pptx

    人工智能的应用 1、 难题求解 主要指那些没有算法解,或虽有算法解但在现有机器上无法实施或无法完成的困难问题,例如智力性问题中的梵塔问题、n皇后问题、旅行商问题、博弈问题等等,就是这样的难题。 人工智能在保险...

    白雪公主与七个小矮人PPT课件.pptx

    我们可以看到,故事中有多个关键元素,例如皇后、猎人、白雪公主、王子等。这些元素构成了故事的骨架,帮助学生更好地理解故事的发展和演进。 知识点7:PPT课件的教学应用 从标签中,我们可以看到,这是一个专业的...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    他善于用容易理解的方法和语言说明复杂的概念。许多人认为他开创了计算机书籍贴近大众的新风,为我国的计算机普及事业做出了重要的贡献。 谭浩强教授曾获全国高校教学成果国家级奖、国家科技进步奖,以及北京市政府...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    他善于用容易理解的方法和语言说明复杂的概念。许多人认为他开创了计算机书籍贴近大众的新风,为我国的计算机普及事业做出了重要的贡献。 谭浩强教授曾获全国高校教学成果国家级奖、国家科技进步奖,以及北京市政府...

Global site tag (gtag.js) - Google Analytics