您的位置:首页 > 其它

八皇后问题 (版本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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: