问题描述
N皇后问题是一个以国际象棋为背景的问题:如何能够在 N×N 的国际象棋棋盘上放置N个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。
解题思路
采取递归+回溯的解法。回溯法又称试探法。回溯法的基本做法是深度优先搜索。即从一条路往前走,能进则进,不能进则退回来,换一条路再试。
代码
输入:
10 ---- 10个测试用例
1 ---- N
2
3
4
5
6
7
8
9
10
输出:
#1 1
#2 0
#3 0
#4 2
#5 10
#6 4
#7 40
#8 92
#9 352
#10 724
import java.util.LinkedList;
import java.util.Scanner;
public class NQueen {
static int N;
static int answer;
static LinkedList<Integer[]> visited;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int test_case = scanner.nextInt();
for (int T=1;T<=test_case;T++){
N = scanner.nextInt();
answer = 0;
visited = new LinkedList();
dfs(0);//从第0行开始递归
System.out.println("#"+T+" "+answer);
}
scanner.close();
}
static void dfs(int n){
if(n == N){//递归结束条件:递归到了N
answer++;
return;
}
int length = visited.size();
for (int i=0;i<N;i++){
boolean flag = true;
//判断第n行第i列是否可以放皇后
for (int j=0;j<length;j++){
Integer[] tPoint = visited.get(j);
if(tPoint[1] == i || Math.abs(n-tPoint[0]) == Math.abs(i-tPoint[1])){
flag = false;
}
}
//第n行第i列可以放皇后则进行递归回溯
if(flag){
Integer[] point = new Integer[2];
point[0] = n;
point[1] = i;
visited.add(point);
dfs(n+1);
visited.pollLast();
}
}
}
}
本文深入探讨了N皇后问题的解决方法,详细解释了如何使用递归加回溯算法来寻找所有可能的解决方案,确保每个皇后都不会受到其他皇后的威胁。通过具体实例,展示了算法的工作流程和实现细节。
2万+

被折叠的 条评论
为什么被折叠?



