递归之八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在 8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法(92)。
思路
-
将第一个皇后放在第一行第一列
-
将第二个皇后放在第二行第一列,判断是否会和其他皇后相互攻击,若会相互攻击,则将其放到第三列、第四列…知道不会相互攻击为止
-
将第三个皇后放在第三行第一列,判断是否会和其他皇后相互攻击,若会相互攻击,则将其放到第三列、第四列…知道不会相互攻击为止,并以此类推,在摆放的过程中,有可能会改动前面所放的皇后的位置
-
当得到一个正确的解时,就会回溯到上一行,由此来找出第一个皇后在第一行第一列的所有解
-
再将第一个皇后放到第一行第二列,并重复以上四个步骤
-
注意:
- 棋盘本身应该是用二维数组表示,但是因为皇后所在的行数是固定的,所以可以简化为用一个一维数组来表示。其中的值代表皇后所在的列
- 数组下标代表皇后所在行数,所以判断是否在同一行列斜线上时,只需要判断是否在同一列和同一斜线上即可
- 是否同列判断:值是否相同
- 是否同一斜线:行号-行号是否等于列号-列号,且列号相减要取绝对值
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | public class Queen8 { int max = 8 ; int [] arr = new int [max]; static int count = 0 ; public static void main(String[] args) { Queen8 queen8 = new Queen8(); queen8.check( 0 ); System.out.printf( "一共有%d种解法" ,count); } /** * 检查该皇后应放的位置 * @param n 要检查的皇后 */ private void check( int n){ if (n == max){ //所有的皇后都放好了,打印并返回 print(); return ; } //把皇后放在每一列上,看哪些不会和之前的冲突 for ( int i = 0 ; i < max; i++){ //把第queen+1个皇后放在第i列 arr[n] = i; if (judge(n)){ //不冲突,就去放下一个皇后 check(n + 1 ); } } } /** * 判断该位置的皇后与前面几个是否冲突 * @param n 需要判断的皇后的位置 * @return true代表不冲突,false代表冲突 */ private boolean judge( int n){ for ( int i = 0 ; i < n; i++){ //如果两个皇后在同一列或者同一斜线,就冲突 //因为数组下标代表行数,所以不会存在皇后在同一行 //所在行数-所在行数 如果等于 所在列数-所在列数,则两个皇后在同一斜线上 if (arr[n] == arr[i] || (n - i) == Math.abs(arr[n] - arr[i])){ return false ; } } return true ; } /** * 打印数组元素 */ private void print(){ count++; //count每加一次说明多了一种解法 for ( int i = 0 ; i < arr.length; i++){ System.out.print(arr[i]+ " " ); } System.out.println(); } } |
这里仅测试了最后一种解法,发现没有问题
本文来自博客园,作者:腹白,转载请注明原文链接:https://www.cnblogs.com/wyh518/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?