Java实现N皇后(搜索和非递归)

本文探讨了N皇后问题的两种解法:深度优先搜索(DFS)和非递归方法。通过具体示例展示了如何在n*n的棋盘上放置n个皇后,使得任意两个皇后无法相互攻击,同时提供了Java实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LintCode题目链接

描述

n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。

给定一个整数n,返回所有不同的n皇后问题的解决方案。

每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。

样例

例1:

输入:1
输出:
   [["Q"]]


例2:

输入:4
输出:
[
  // Solution 1
  [".Q..",
   "...Q",
   "Q...",
   "..Q."
  ],
  // Solution 2
  ["..Q.",
   "Q...",
   "...Q",
   ".Q.."
  ]
]

深度搜索遍历

import java.util.ArrayList;
import java.util.Scanner;

/**
 * N皇后问题
 * 深度搜索
 * @author qgfzzzzzz
 *
 */
public class DFSOfNQueues {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		ArrayList<ArrayList<String>> listAll = nQueues(n);
		System.out.println(listAll);
	}
	public static ArrayList<ArrayList<String>> nQueues(int n) {
		ArrayList<ArrayList<String>> listAll = new ArrayList<>();
		char[][] ch = new char[n][n];
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < n; j++) {
				ch[i][j] = '.';
			}
		}
		dfs(0, n, ch, listAll);
		return listAll;
	}
	public static void dfs(int row, int n, char[][] ch, ArrayList<ArrayList<String>> listAll) {
		if(row == n) {
			ArrayList<String> list = new ArrayList<>();
			for(int i = 0; i < n; i++) {
				StringBuilder stringBuilder = new StringBuilder();
				for(int j = 0; j < n; j++) {
					stringBuilder.append(String.valueOf(ch[i][j]));
				}
				list.add(stringBuilder.toString());
			}
			listAll.add(list);
			return;
		}
		for(int i = 0; i < n; i++) {
			if(isPlace(ch, n, row, i)) {
				ch[row][i] = 'Q';
				dfs(row + 1, n, ch, listAll);
				ch[row][i] = '.';
			}
		}
	}
	public static boolean isPlace(char[][] ch, int n, int row, int col) {
		for(int i = 0; i < row; i++) {
			if(ch[i][col] == 'Q') return false;
			if(row + col - i < n && ch[i][row + col - i] == 'Q') return false;
			if(col - row + i >= 0 && ch[i][col - row + i] == 'Q') return false;
		}
		return true;
	}
}

非递归

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * N皇后问题
 * 非递归
 * @author LENOVO
 *
 */
public class LoopOfNQueues {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		List<List<String>> listAll = new ArrayList<List<String>>();
		int[] pos = new int[n];
		for(int i = 0; i < n; i++) pos[i] = -1;
		int row = 0;
		while(row >= 0) {
			while(++pos[row] < n && !isPlace(pos, row)) {}
			if(pos[row] < n) {
				if(row == n - 1) {
					List<String> list = new ArrayList<>();
					for(int i = 0; i < n; i++) {
						StringBuilder sBuilder = new StringBuilder();
						for(int j = 0; j < n; j++) {
							if(pos[i] == j) sBuilder.append("Q");
							else sBuilder.append(".");
						}
						list.add(sBuilder.toString());
					}
					listAll.add(list);
					--row;
				}
				else {
					pos[++row] = -1;
				}
			}
			else row--;
		}
		System.out.println(listAll);
	}
	public static boolean isPlace(int[] pos, int row) {
		for(int i = 0; i < row; i++) {
			if(pos[i] == pos[row] || Math.abs(pos[i] - pos[row]) == row - i) return false;
		}
		return true;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值