问题描述
八皇后是基于国际象棋,进行一个小游戏:在一个8 * 8的棋盘上,放置8个皇后(就是8个位置棋子),每个皇后与其他皇后不能在同一行和同一列或者是同一个斜线上,需要寻找摆放位置。
问题分析
1、需要使用一个二维数据array[][] 分别代表皇后放置在第几行,第几列。
2、皇后放置不能越界
3、判断皇后的位置不与其他皇后冲突,即每个皇后坐标不能有相同的横坐标或者是纵坐标,斜线上判断横坐标与横坐标相减绝对值不能等于纵坐标与纵坐标相减的绝对值。
4、从第一行第一列开始排列,利用回溯的思想,进行寻找
代码实现
public class EightQueen { private int[] queen; public void setQueen(int n){ queen = new int[n]; for (int i = 0 ;i < n ;i++){ queen[i] = -1; } int r = 0; // 代表行数 while (true){ // 当前行放置皇后位置,比上一次需要往后挪动一个 queen[r] += 1; // 判断当前皇后位置,是否已经越界,未越界情况下,继续判断是否冲突 if (queen[r] >= n ){ // 如果已经越界,说明当前行的位置与之前的皇后位置都有冲突,则需要回头挪动上一行的皇后 if (r>0) {// 需要在回退行大于第0行的情况下,才进行回退,否则第0行的皇后都越界了,说明不需要再进行寻找了 queen[r] = -1; // 设置当前行皇后为初始无放置状态 r--;// 回退一行 continue; // 继续寻找合适位置逻辑 } else { // 结束循环 break; } } if (!isConflict(r)){ // 当前旗子没有冲突,将当前行皇后安放号,准备安放下一行皇后 r++; // 行向后挪动一位 if (r >= n){ // 判断向下的行是否已经到了最大行,如果已经是最大行,则说明完成了一次放置,进行回溯处理 // 打印当前皇后位置摆放 for (int i = 0;i < n;i++){ System.out.print(queen[i]+" "); } System.out.println(); r--; } } } } public boolean isConflict(int k){ for (int i = k -1;i>-1;i--){ if (queen[k] == queen[i] || Math.abs(queen[k]-queen[i])==Math.abs(k - i)){ return true; } } return false; } public static void main(String[] args) { EightQueen eightQueen = new EightQueen(); eightQueen.setQueen(8); }}