N皇后问题(DFS-深度优先算法)
N皇后问题(DFS-深度优先算法)
题目描述:
在 N×N 的方格棋盘放置了 N 个皇后,使得它们不相互攻击(即任意 22 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 45° 的斜线上。你的任务是,对于给定的 N,求出有多少种合法的放置方法。
输入描述:
输入中有一个正整数 N<=10,表示棋盘和皇后的数量
输出描述:
为一个正整数,表示对应输入行的皇后的不同放置数量。
输入输出样例:
示例:
输入:
5
输出:
10
运行限制:
最大运行时间:1s 最大运行内存: 256M
解题思路
- 设置当前行为第一行,当前列为第一列,从第一行第一列(1,1)开始搜索,也就是说皇后只能从第一行放到第N行,我们也就不用再考虑同一行的问题,只需要去判断同一列和同一斜线的问题。
- 利用数组进行存储,如:x[a] = i,就表示第a个皇后在第a行的第i列(即不用考虑同一行的问题);
- 同一列的判断: 只需要判断其行数和列数是否相等,即 x[a] != x[i]
- 同一斜线的判断: 只需要判断其
行之差
!=列之差
即可 - 进行搜索: 当搜索到N+1行的时候,就表示第N行已经搜索完成,就将记录进行 +1 处理
- 若在当前位置上不满足条件就进行回溯
JAVA语言:
import java.util.Scanner; import static java.lang.Math.abs; public class Main { static int x[] = new int[15]; static int sum, n; static boolean PD(int k) { for (int i = 1; i < k; i++) { if (abs(k - i) == abs(x[k] - x[i])) return false; else if (x[k] == x[i]) return false; //即判断是否符合条件来放,i表示皇后所在的行数,x[i]表示所在的列数, //所以前面那个条件用来判断两个皇后是否在对角线上,后面用来判断是否在同一列上。 //行数不需要判断,因为他们本身的i就代表的是行数 } return true; } static boolean check(int a) { if (a > n) sum++; else return false; return true; } static void DFS(int a) { if (check(a)) return; else for (int i = 1; i <= n; i++) { x[a] = i; //第a个皇后放的列数 if (PD(a)) //判断是否能放这步 DFS(a + 1); //能的话进行下一个皇后的放置 else continue; //不能就下一列 } } public static void main(String[] args) { Scanner in = new Scanner(System.in); n = in.nextInt(); //表示几个皇后 DFS(1); //每次都从第一个皇后开始 System.out.println(sum); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律