洛谷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();
	}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值