Loading

皇后问题(dfs)

一、问题解析

原题链接:https://www.acwing.com/problem/content/845/

image-20220301120406973

国际象棋中的皇后可以横着走、竖着走、斜着走。此题要求每一个皇后都不能互相攻击到。

image-20220301215837446

二、代码实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
	// 数据范围1~9,由于斜方向的原因,所以给两倍大的数据范围20。
	static int N = 20;

	// n*n的棋盘
	static int n;

    //记录“皇后”位置
	static String[][] g;

	// 列 不重复
	static boolean[] col = new boolean[N];
	// 正斜 不重复
	static boolean[] dg = new boolean[N];
	// 反斜 不重复
	static boolean[] bdg = new boolean[N];

	private static void dfs(int u) {

		if (u == n) {
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < n; j++) {
					System.out.print(g[i][j]);
				}
				System.out.println();
			}
			System.out.println();
			return;
		}
		
		for (int i = 0; i < n; i++) {
			//如果col、dg、bdg都是false的话,可以在该位置放置“皇后”
			if (!col[i] && !dg[i - u + n] && !bdg[u + i]) {
				//标记“皇后”
				g[u][i] = "Q";
				
                //将当前列、正斜、反斜标记为已使用
				col[i] = true;
				dg[i - u + n] = true;
				bdg[u + i] = true;
				
				dfs(u + 1);
				
                //清理现场,复原
				col[i] = false;
				dg[i - u + n] = false;
				bdg[u + i] = false;
				
				g[u][i] = ".";
			}
		}

	}

	public static void main(String[] args) throws IOException {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(reader.readLine());

        //先让每个位置都为“.”
		g = new String[n][n];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				g[i][j] = ".";
			}
		}

		dfs(0);

		reader.close();
	}

}
posted @ 2022-03-02 15:55  KledKled  阅读(119)  评论(0编辑  收藏  举报