八皇后及N皇后问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种方法可以解决此问题。

请编程实现八皇后问题,并把92种解的前三种解输出到屏幕(8*8的二维矩阵,Q代表皇后,X代表空)。并把此问题的求解过程延伸到N皇后问题。

程序代码如下所示:

package算法;

publicclass EightQueen{

private int index=1;

privatefinalstatic int SCALE=8;

private int[]answer=new int[SCALE];

private void initArray(){

for(int i=0;i

answer[i]=-1;

}

}

private boolean canStay(int row,int col){

for(int i=0;i

{

if(answer[i]==col||Math.abs(row-i)==Math.abs(col-answer[i])) {

return false;

}

}

return true;

}

private void calculate(){

for(int row=0;row

{

if(answer[row]==-1)

{

answer[row]=0;

}

for(int col=answer[row];col<=SCALE;col++)

{

if(col==SCALE)

{

answer[row]=-1;

row--;

if(row<0)

return;

}

col=answer[row];

continue;

}

if(canStay(row,col))

{

answer[row]=col;

if(row==SCALE-1)

{

showMsg();

continue;

}

break;

}

}

}

}

private void showMsg(){

if(index<4)

{

System.out.println(" - 第"+index+"种方案-"); for(int i=0;i

for(int j=0;j

{

if(answer[i]==j)

{

System.out.print("Q ");

}else{

System.out.print("X ");

}

}

System.out.println("");

}

System.out.println("\n");

index++;

}

}

public EightQueen(){

initArray();

calculate();

}

publicstatic void main(String[]args){

System.out.println("列举"+SCALE+"皇后问题的前3 种方案!"); System.out.println();

EightQueeneightQueen=new EightQueen();

}

相关文档
最新文档