八皇后问题

来源:互联网 发布:经济结构优化 编辑:程序博客网 时间:2024/05/16 08:14

回溯法解决八皇后问题


  • 八皇后问题,国际象棋是8x8的棋盘,其中皇后可以斜着走,竖着走,横着走,无距离限制
  • 问:如果在这个棋盘上面摆满8个皇后,同时相互不被吃掉
public class QueenSort {    static int count = 1;    public static void main(String[] args) {        int arr[][] = new int[8][8];        putQueen(arr,0);        //show(arr);    }    public static void show(int arr[][]){        System.out.println("第"+count+"摆法");        for(int i=0;i<arr.length;i++){            for(int j=0;j<arr.length;j++){                System.out.print(arr[i][j]+"\t");            }            System.out.println();        }        count ++;    }    /**     *     * @return 该格是否可以存放皇后      */    public static boolean check(int arr[][],int row,int col){        //行方向不用判断,原因是我们的走法是从左至右边        //只判断3个方向的原因是,从下往上走(假设00下标在最左下角)        //列方向        for(int i=row-1;i>=0;i--){            if(arr[i][col] == 1) return false;        }        //左斜上        for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--){            if(arr[i][j] == 1) return false;        }        //右斜上        for(int i=row-1,j=col+1;i>=0&&j<8;i--,j++){            if(arr[i][j] == 1) return false;        }        return true;    }    //存放queen    public static void putQueen(int arr[][],int row){        for(int i=0;i<8;i++){            if(check(arr,row,i)){                arr[row][i] = 1;                    if(row>=7){                    show(arr);                }else{                    putQueen(arr,row+1);                                }                arr[row][i] = 0;    //递归回走就设置为0            }        }    }}
原创粉丝点击