您的位置:首页 > 产品设计 > UI/UE

Queen 八皇后问题 回溯经典解法

2013-09-19 00:55 423 查看
/*
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。

@author arhaiyun

2013/09/19

*/

public class Queen
{
//初始化为0表示该行对应位置所处的列上没有queen
private int[] column;
//初始化为0表示该行对应位置所处的右对角线上上没有queen
private int[] rightup;
//初始化为0表示该行对应位置所处的左对角线上列上没有queen
private int[] leftup;
//Queue位置记录
private int[] queen;

private static int num = 0;

Queen()
{
column = new int[8 + 1];
rightup = new int[2 * 8 + 1];
leftup = new int[2 * 8 + 1];
queen = new int[8 + 1];

for(int i = 1; i <= 8; i++)
queen[i] = column[i] = 0;

for(int i = 0; i <= 2 * 8; i++)
rightup[i] = leftup[i] = 0;
}

public void backtrack(int i)
{
if(i > 8)
{
showResult();
}
else
{
for(int j = 1; j <= 8; j++)
{
if(column[j] == 0
&& rightup[9 - i + j] == 0
&& leftup[i + j] == 0)
{
//放置皇后
queen[i] = j;
column[j] = rightup[9 - i + j] = leftup[i + j] = 1;
//回溯遍历
backtrack(i + 1);
column[j] = rightup[9 - i + j] = leftup[i + j] = 0;
}
}
}
}

protected void showResult()
{
num++;
System.out.println("\nResolution:"+num);

for(int i = 1; i <= 8; i++)
{
for(int j = 1; j <= 8; j++)
{
if(queen[i] == j)
{
System.out.print(" Q");
}
else
{
System.out.print(" .");
}
}
System.out.println();
}
}

public static void main(String[] args)
{
Queen queen = new Queen();
queen.backtrack(1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: