八皇后问题 (版本2)
2018-03-23 16:53
148 查看
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法?
分析:前面给出了n皇后的解题方法,是用c语言写的,今天用java再写一个八皇后的代码。
每一行放一个皇后,只要保证每一列和对角线上不存在两个皇后就行。
对角线上是否存在两个皇后的判断:假设现在有(x1,y1)和(x2,y2)两个皇后,只要保证 x1-x2的绝对值不等于y1-y2的绝对值即可判断两个皇后不在同一对角线上。public class Main {
public static int count=0;
public static boolean book[][] = new boolean[9][9];
public static boolean isOK(int row,int col) //判断第row行的皇后可不可以放在第col列上
{
for(int i=1;i<row;i++)
{
for(int j=1;j<=8;j++)
{
if(book[i][j])
{
if(j == col || row-i == Math.abs(col-j))
{
return false;
}
}
}
}
return true;
}
public static void dfs(int row) //第row行的皇后放的位置
{
if(row == 9)
{
count++;
return;
}
for(int col=1;col<=8;col++)
{
if(isOK(row,col)) //判断第row行的皇后可不可以放在第col列上
{
book[row][col] = true;
dfs(row+1);
book[row][col] =false; //回溯
}
}
}
public static void main(String[] args) {
dfs(1);
System.out.println(count);
}
}
分析:前面给出了n皇后的解题方法,是用c语言写的,今天用java再写一个八皇后的代码。
每一行放一个皇后,只要保证每一列和对角线上不存在两个皇后就行。
对角线上是否存在两个皇后的判断:假设现在有(x1,y1)和(x2,y2)两个皇后,只要保证 x1-x2的绝对值不等于y1-y2的绝对值即可判断两个皇后不在同一对角线上。public class Main {
public static int count=0;
public static boolean book[][] = new boolean[9][9];
public static boolean isOK(int row,int col) //判断第row行的皇后可不可以放在第col列上
{
for(int i=1;i<row;i++)
{
for(int j=1;j<=8;j++)
{
if(book[i][j])
{
if(j == col || row-i == Math.abs(col-j))
{
return false;
}
}
}
}
return true;
}
public static void dfs(int row) //第row行的皇后放的位置
{
if(row == 9)
{
count++;
return;
}
for(int col=1;col<=8;col++)
{
if(isOK(row,col)) //判断第row行的皇后可不可以放在第col列上
{
book[row][col] = true;
dfs(row+1);
book[row][col] =false; //回溯
}
}
}
public static void main(String[] args) {
dfs(1);
System.out.println(count);
}
}
相关文章推荐
- 八皇后问题(C语言版本)
- visual studio低版本打开高版本建的工程
- 微软认真了!微软Surface平板强来袭击,采用IntelX86 I5 CPU 支持Windows8 Pro版本 全面兼容PC端软件
- 基础插件升级说明(到3.3.1.4版本)
- 使用TortoiseGit对Git版本进行分支操作
- vim 配置文件,经过修改,比较好用的版本
- MySQL5.0版本的安装图解
- svn与git结合,实现版本管理
- PHP5历史以及各个版本的新功能和新特性收集总结
- Java编译的jdk与安装的jdk版本不一致
- Android Studio中集成百度地图获取本地debug版本的签名证书SHA1值
- android 版本更新
- git版本回退
- djangobook的旧版本代码,关于数据库
- ubuntu桌面版最新版本安装
- PSP Daily软件beta版本——基于spec评论
- SQLSERVER与ORACLE存储过程对比ORACLE版本(函数,程序包,程序体,存储过程)
- {算法竞赛入门经典}第二章 文件操作 重定向及fopen版本
- 在vista或win7以上版本提升bat脚本的执行权限
- ZigBee各版本规范比较