题目链接:https://www.luogu.com.cn/problem/P1219
题目:
思路:
八皇后问题,典型dfs,dfs练习。
代码:
不是很熟练,代码有些冗余
import java.util.ArrayList;
import java.util.Scanner;
public class P1219_八皇后CheckerChallenge {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
boolean[] use = new boolean[n];//是否使用状态数组
//遍历第一行的数
for (int i = 1; i <= n; i++) {
ArrayList<Integer> list = new ArrayList<>();//建立结果数组
list.add(i);//第一行放置位置
use[i - 1] = true;//使用过置为true
dfs(n, list, use);
list.remove(list.size() - 1);//回溯
use[i - 1] = false;//回溯
}
//输出结果
for (int i = 0; i < 3; i++) {
StringBuilder stringBuilder = new StringBuilder();
ArrayList<Integer> list = reslists.get(i);
for (Integer integer : list) {
stringBuilder.append(integer + " ");
}
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
System.out.println(stringBuilder.toString());
}
System.out.println(reslists.size());
}
private static ArrayList<ArrayList<Integer>> reslists = new ArrayList<>();//结果集合
/*
*
* @param n 棋盘边长
* @param list 结果数组
* @param use 是否使用数组
* @author DaiLong
* @date 2022/4/24 10:40
* @return void
*/
private static void dfs(int n, ArrayList<Integer> list, boolean[] use) {
if (list.size() == n) {
reslists.add(new ArrayList<>(list));
return;
}
for (int i = 1; i <= n; i++) {
if (!use[i - 1] && po(i, list)) {//代表这个节点没有使用 并且判断这个节点位置合理
use[i - 1] = true;
list.add(i);
dfs(n, list, use);
use[i - 1] = false;
list.remove(list.size() - 1);
}
}
}
//判断放置棋子是否符合站位
//两点之间斜率不能为1或-1
private static boolean po(int n, ArrayList<Integer> list) {
int m = list.size() + 1;
for (int i1 = 0; i1 < list.size(); i1++) {
int n1 = i1 + 1 - m;
int m1 = list.get(i1) - n;
if (n1 == 0 || m1 == 0 || n1 == m1 || n1 == -m1) {
return false;
}
}
return true;
}
}