八皇后
八皇后问题是个很经典的递归、迭代问题。解决思路就是只要保证所有皇后不在同一列和同斜线上。
假设就j,k为两个皇后所在的行 x[j]、x[k]表示两个皇后的位置。当两个皇后在同一列或同斜线上 可以用数学式子来表达|j-k|=|x[j]-x[k]|、x[j]=x[k]。所有当这两个条件不满足的时候问题就能解决。
解决方法如下:
- public class Queen8 {
- public static int num = 0; //累计方案总数
- public static final int MAXQUEEN = 8;//皇后个数,同时也是棋盘行列总数
- public static int[] cols = new int[MAXQUEEN]; //定义cols数组,表示8列棋子摆放情况
- public Queen8() {
- //核心函数
- getArrangement(0);
- System.out.print("/n");
- System.out.println(MAXQUEEN+"皇后问题有"+num+"种摆放方法。");
- }
- public void getArrangement(int n){
- //遍历该列所有不合法的行,并用rows数组记录,不合法即rows[i]=true
- boolean[] rows = new boolean[MAXQUEEN];
- for(int i=0;i<n;i++){
- rows[cols[i]]=true;
- int d = n-i;
- if(cols[i]-d >= 0)rows[cols[i]-d]=true;
- if(cols[i]+d <= MAXQUEEN-1)rows[cols[i]+d]=true;
- }
- for(int i=0;i<MAXQUEEN;i++){
- //判断该行是否合法
- if(rows[i])continue;
- //设置当前列合法棋子所在行数
- cols[n] = i;
- //当前列不为最后一列时
- if(n<MAXQUEEN-1){
- getArrangement(n+1);
- }else{
- //累计方案个数
- num++;
- //打印棋盘信息
- printChessBoard();
- }
- }
- }
- public void printChessBoard(){
- System.out.print("第"+num+"种走法 /n");
- for(int i=0;i<MAXQUEEN;i++){
- for(int j=0;j<MAXQUEEN;j++){
- if(i==cols[j]){
- System.out.print("0 ");
- }else
- System.out.print("+ ");
- }
- System.out.print("/n");
- }
- }
- public static void main(String args[]){
- Queen8 queen = new Queen8();
- }
- }