N皇后问题
创始人
2025-05-28 03:34:55
0

先看八皇后问题:

在这里插入图片描述
八个皇后在8x8的棋盘上,要求他们放置的位置(两两)不能在同一行、同一列和同一斜线上,问有几种摆法

首先先明确怎么不能在同一行,同一列和同一对角线上

如果我们的定义一个二维数组int[][] nums= ne int[8][8](i,j)代表第n个皇后所在位置,那么两个皇后不在同一行和同一列,就是i值不等、j值也不等。
明确这个问题之后,怎么保证不在同一个斜线上呢?在n*n的矩形里,所谓的斜线和边的夹角为45°,那么可以得到,|x1 - x2| = |y1 - y2|的,所以就是|i1 - i2| = |j1 - j2|
为了方便后续操作,我们将二维数组nums简化为一维数组arri代表n个皇后所在横坐标 arr[i]代表第n个皇后所在纵坐标,所以就是(i,arr[i]),所以判断斜线就是|i1 - i2| =| arr[i1] - arr[i2] |
那么我们的写法就是:

/**
* @author 我见青山多妩媚
* @date Create on 2023/3/15 10:22
*/
public class EightQueens {public static void main(String[] args) {QueensPut queensPut = new QueensPut();//棋盘 8 * 8 8个皇后,arr下标代表皇后所在第i行,arr[i]代表第arr[i]列 第i个皇后所在位置为(i,arr[i])int[] arr = new int[8];//防止第1个皇后开始queensPut.putQueen(arr,0);}
}class QueensPut{int count = 0;public void putQueen(int[] arr,int n){//找到一种满足的情况if(n == 8){count++;System.out.println("第"+count+"种:");printQueue(arr);return;}for(int i = 0;i<8;i++){//第n个皇后的第i种摆法arr[n] = i;if(verity(arr,n)){//如果没冲突,递归继续n+1个皇后的放置方法,有冲突就从i++里面找putQueen(arr,n+1);}}}//检查第m个皇后和前m-1个皇后摆放位置是否有冲突boolean verity(int[] arr,int m){for(int i = 0;i//m > i 所以只需要判断是否所在同一列 arr[i] == arr[m]//如果在同一对角线,那么 |i - j| == |arr[i] - arr[j]|if(arr[i] == arr[m] || Math.abs(m - i ) == Math.abs(arr[i] - arr[m])){return false;}}return true;}//数组arr转为二维数组,打印皇后所在位置public void printQueue(int[] arr){for (int k : arr) {for (int j = 0; j < arr.length; j++) {//一维数组转化为二维数组过程中,当arr[i] == j,// 即因为j也是从0开始,相当于找到arr[i] = i的时候,说明这个数时有值的 不是0,是皇后放的位置char num = k == j ? 'Q' : '-';System.out.print(num+" ");}System.out.println();}}public int getCount(){return this.count;}
}

运行结果:
在这里插入图片描述

N皇后问题

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
力扣-51 N皇后
有了八皇后为基础,那么n皇后其实也好写了

/*** @author 我见青山多妩媚* @date Create on 2023/3/15 11:10*/
public class NQueens {List> lists = new ArrayList<>();public List> solveNQueens(int n) {int[] arr = new int[n];putQueens(arr,0,n);return lists;}void putQueens(int[] arr,int m,int n){if(n == m){toStringArray(arr);return;}for(int i = 0;iarr[m] = i;if(verity(arr,m)){putQueens(arr,m+1,n);}}}boolean verity(int[] arr,int m){for(int i = 0;iif(arr[i] == arr[m] || Math.abs(i - m) == Math.abs(arr[i] - arr[m])){return false;}}return true;}void toStringArray(int[] arr){List list = new ArrayList<>();for(int k : arr){StringBuilder builder = new StringBuilder();for(int j = 0; jbuilder.append(k == j ? "Q" : ".");}list.add(builder.toString());}lists.add(new ArrayList<>(list));}
}

相关内容

热门资讯

中证A500ETF摩根(560... 8月22日,截止午间收盘,中证A500ETF摩根(560530)涨1.19%,报1.106元,成交额...
A500ETF易方达(1593... 8月22日,截止午间收盘,A500ETF易方达(159361)涨1.28%,报1.104元,成交额1...
何小鹏斥资约2.5亿港元增持小... 每经记者|孙磊    每经编辑|裴健如 8月21日晚间,小鹏汽车发布公告称,公司联...
中证500ETF基金(1593... 8月22日,截止午间收盘,中证500ETF基金(159337)涨0.94%,报1.509元,成交额2...
中证A500ETF华安(159... 8月22日,截止午间收盘,中证A500ETF华安(159359)涨1.15%,报1.139元,成交额...
科创AIETF(588790)... 8月22日,截止午间收盘,科创AIETF(588790)涨4.83%,报0.760元,成交额6.98...
创业板50ETF嘉实(1593... 8月22日,截止午间收盘,创业板50ETF嘉实(159373)涨2.61%,报1.296元,成交额1...
港股异动丨航空股大幅走低 中国... 港股航空股大幅下跌,其中,中国国航跌近7%表现最弱,中国东方航空跌近5%,中国南方航空跌超3%,美兰...
电网设备ETF(159326)... 8月22日,截止午间收盘,电网设备ETF(159326)跌0.25%,报1.198元,成交额409....
红利ETF国企(530880)... 8月22日,截止午间收盘,红利ETF国企(530880)跌0.67%,报1.034元,成交额29.0...