洛谷P1219 Java解法

题目出处
在这里插入图片描述

代码里有解释(深搜):

package search;

import java.util.Scanner;

public class P1219 {

	static int n, sum = 0;// sum记录输出次数
	static int[] arr;// 用一维数组表示皇后的位置,下标代表行,值代表列

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		arr = new int[n];
		dfs(0);
		System.out.println(sum);// 最后记得输出m
	}

	public static void dfs(int now) {
		if (now == n) {
			if (sum < 3) {
				print();
			}
			sum++;// 没输出一次就++
			return;
		}

		for (int i = 0; i < n; i++) {
			arr[now] = i;// 先把当前now位置的值置为1,代表第now行第1列
			boolean ok = false;//初始值设为不和前面的冲突
			for (int j = 0; j < now; j++) {
				// 列的位置相等 或 在同一斜线上都是冲突
				//其实可以用下面这个式子这个判断对角线是否冲突,但是会最后一个测试点TLE,可能调方法也蛮耗时间
				//Math.abs(j - now) == Math.abs(arr[j] - arr[now])
				//我们把上面这个式子用不调方法的方式写出来就不会TLE了,就很奇怪
				if (arr[j] == arr[now] || now - j == arr[now] - arr[j] || j -now == arr[now] - arr[j]) {
					ok = true;
					break;
				}
			}
			if (!ok) {//不冲突就继续放下一行
				dfs(now+1);
			}
			// 冲突的话继续把该皇后放在下一列
		}
	}

	public static void print() {
		for (int i = 0; i < n; i++) {
			System.out.print(arr[i] + 1 + " ");// 根据题目要求应该+1
		}
		System.out.println();
	}
}

猜你喜欢

转载自blog.csdn.net/TXXERIN/article/details/107461468