首页 > 代码库 > 八皇后问题
八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
(因JAVA部分知识的短缺,故有所参考自http://baike.baidu.com/view/622604.htm#sub698719)
1 public class Queen{//同栏是否有皇后,1表示有 2 private int[] column;//右上至左下是否有皇后 3 private int[] rup;//左上至右下是否有皇后 4 private int[] lup;//解答 5 private int[] queen;//解答编号 6 private int num; 7 8 public Queen(){ 9 column=new int[8+1];10 rup=new int[(2*8)+1];11 lup=new int[(2*8)+1];12 13 for(int i=1;i<=8;i++)14 column[i]=0;15 16 for(int i=1;i<=(2*8);i++)17 rup[i]=lup[i]=0; //初始定义全部无皇后18 19 queen=new int[8+1];20 }21 22 public void backtrack(int i){23 if(i>8){24 showAnswer();25 }26 else{27 for(int j=1;j<=8;j++){28 if((column[j]==0)&&(rup[i+j]==0)&&(lup[i-j+8]==0)){//若无皇后29 queen[i]=j;//设定为占用30 column[j]=rup[i+j]=lup[i-j+8]=1;31 backtrack(i+1); //循环调用32 column[j]=rup[i+j]=lup[i-j+8]=0;33 }34 }35 }36 }37 38 protected void showAnswer(){39 num++;40 System.out.println("\n解答"+num);41 42 for(int y=1;y<=8;y++){43 for(int x=1;x<=8;x++){44 if(queen[y]==x){45 System.out.print("Q");46 }47 else{48 System.out.print(".");49 }50 }51 52 System.out.println();53 }54 }55 56 public static void main(String[]args){57 Queen queen=new Queen();58 queen.backtrack(1);59 }60 }
运行得出共有92种摆法。
八皇后问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。