八皇后及N皇后问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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(); }