java实现N皇后问题

N皇后问题描述:
将 n 个皇后摆放在一个 n x n 的棋盘上,使得每一个皇后都无法攻击到其他皇后。
深度优先遍历的典型案例。

程序输入:
    n的个数(需>4)
    棋盘上任意一个位置
程序输出:
    满足问题需求的棋盘坐标

程序代码如下:
Node类用于封装皇后的棋盘位置信息
public class Node {
	private int x;
	private int y;
	public Node(int x,int y){
		this.x=x;
		this.y=y;
	}
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	@Override
	public String toString() {
		return "(" + x + "," + y + ")";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + x;
		result = prime * result + y;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Node other = (Node) obj;
		if (x != other.x)
			return false;
		if (y != other.y)
			return false;
		return true;
	}
}
Searcher类用于查询指定起始位置的N皇后坐标
public class Searcher {
	private int num=0;
	public Searcher(int num){
		this.num=num;
	}
	public List<Node> search(Node node){
		List<Node> solution=new ArrayList<Node>();
		if(qualified(node,solution)){
			return solution;
		}else{
			return null;
		}
	}
	/**
	 * 先序遍历
	 */
	private boolean qualified(Node node,List<Node> solution){
		if(attach(node,solution)){
			return false;
		}
		solution.add(node);
		if(solution.size()==num){//是否是最后一个节点
			return true;
		}
		//获取node的子节点
		boolean res=false;
		for(Node child:obtainChild(node)){
			if(qualified(child,solution)){
				res=true;
				break;
			}
		}
		if(!res){
			solution.remove(node);
		}
		return res;
	}
	private List<Node> obtainChild(Node node) {
		List<Node> res=new ArrayList<Node>();
		for(int i=0;i<num;i++){
			if(i==node.getX()){//过滤同一行
				continue;
			}
			for(int j=0;j<num;j++){
				if(j==node.getY()){//过滤同一列
					continue;
				}
				if(Math.abs(node.getX()-i)==Math.abs(node.getY()-j)){//过滤对角线;
					continue;
				}
				res.add(new Node(i,j));
			}
		}
		return res;
	}
	private boolean attach(Node node,List<Node> nodes){
		if(nodes.size()==0){//跳过首节点
			return false;
		}
		for(Node tempNode:nodes){
			if(node.getX()==tempNode.getX() ||//同一行
					node.getY()==tempNode.getY() ||//同一列
					Math.abs(node.getX()-tempNode.getX())==Math.abs(node.getY()-tempNode.getY())){//对角线
				return true;
			}
		}
		return false;
	}
}
Main类用于编码测试
public class Main {
	public static void main(String[] args) {
		Searcher searcher=new Searcher(6);
		List<Node> res=searcher.search(new Node(2,0));
		System.out.println(res);
	}
}
打印输出:[(2,0), (0,4), (1,2), (3,5), (4,3), (5,1)]

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好!如果我理解正确,您的问题是如何使用Java实现n皇后问题的解决方法,我会尽力给出解答。 n皇后问题是一个经典的问题,旨在找到在n×n棋盘上放置n个皇后的所有不同方式,使得它们互相攻击的情况最少。在Java中,您可以使用回溯算法来解决这个问题。 下面是一个Java实现n皇后问题的示例代码: ``` public class NQueens { private int[] queens; public void solve(int n) { queens = new int[n]; placeQueen(0, n); } private void placeQueen(int row, int n) { if (row == n) { printQueens(); return; } for (int col = 0; col < n; col++) { if (isValid(row, col)) { queens[row] = col; placeQueen(row + 1, n); } } } private boolean isValid(int row, int col) { for (int i = 0; i < row; i++) { int pos = queens[i]; if (pos == col || pos - i == col - row || pos + i == col + row) { return false; } } return true; } private void printQueens() { for (int i = 0; i < queens.length; i++) { for (int j = 0; j < queens.length; j++) { if (queens[i] == j) { System.out.print("Q "); } else { System.out.print(". "); } } System.out.println(); } System.out.println(); } public static void main(String[] args) { NQueens nQueens = new NQueens(); nQueens.solve(4); } } ``` 在这个示例中,我们使用一个int类型的数组queens来保存每一行中皇后所在的列数。在placeQueen方法中,我们对每一行进行迭代,并尝试在该行的所有列中放置一个皇后。在每次迭代时,我们检查该皇后是否不会攻击到之前放置的皇后,并在不会冲突的情况下递归地继续放置下一个皇后,直到所有皇后都被放置在棋盘上为止。 如果我们放置好了n个皇后,就会调用printQueens方法打印出结果。在isValid方法中,我们检查一个皇后是否会被其他皇后攻击到。如果我们成功地找到了所有不同的n皇后解决方案,就会在控制台上输出相应的结果。 最后,在main方法中,我们创建了一个NQueens对象,并使用solve方法来解决n皇后问题。在这个例子中,我们使用n=4来演示程序的运行情况。 希望这个例子可以帮助您更好地理解Javan皇后问题的解决方法。如果您有 ### 回答2: n皇后问题是指在一个n×n的棋盘上放置n个皇后,使得任意两个皇后不在同一行、同一列或同一对角线上。下面是用Java实现n皇后问题的求解的步骤: 1. 定义一个二维数组board,表示棋盘,初始化所有元素为0。 2. 定义一个递归函数solveNQueen,用于寻找解决n皇后问题的解。 3. 在solveNQueen函数中,使用回溯算法进行搜索。从左到右遍历每一行,在每一行中尝试放置一个皇后。 - 对于当前行的每一个位置,首先判断是否与已放置的皇后冲突(是否在同一列或同一对角线)。 - 如果不冲突,则将当前位置设置为1,表示放置一个皇后。 - 继续递归调用solveNQueen函数,处理下一行。 - 如果递归调用返回的结果为真,则表明找到了一个解,将其返回。 - 如果递归调用返回的结果为假,则回溯,将当前位置重新置为0,继续尝试下一个位置。 4. 在solveNQueen函数中,使用一个整型变量count来记录找到的解的数量。 5. 在solveNQueen函数中,处理每一行后,如果当前行是最后一行,说明找到了一个解,将count加一,并返回真。 6. 在外部调用solveNQueen函数,并输出结果。 这样就用Java实现n皇后问题的求解。该算法通过回溯的方式搜索所有可能的解,找到其中一个解后再继续搜索,直到找到所有解或者搜索完所有可能的情况。实际上,该算法的时间复杂度很高,随着n的增加,求解的时间将指数增长。因此,在实际应用中,可能需要使用一些剪枝策略或优化算法来减少搜索的时间。 ### 回答3: n皇后问题是一个经典的回溯算法问题,可以用Java实现。 首先,我们需要定义一个二维数组来表示棋盘,棋盘的大小为n×n,其中n是皇后的个数。我们可以将棋盘的每个位置初始化为0,表示该位置没有放置皇后,如果该位置放置了皇后,则置为1。 接下来,我们使用递归的方式来寻找合适的解。首先,我们从第一行开始遍历棋盘,对于每一行我们都遍历该行的每一个位置。对于每个位置,我们检查是否满足以下条件: 1. 当前位置没有其他皇后威胁到它的位置(即没有其他皇后在同一行、同一列、同一对角线上); 2. 如果满足条件1,则将当前位置置为1,表示在该位置放置了皇后; 3. 继续递归调用求解函数,对下一行继续进行查找; 4. 如果下一行没有找到合适的位置,说明当前位置不可行,将当前位置置为0,回溯到上一步继续寻找其他位置。 在递归调用过程中,我们还需要记录所有合适的解。当我们找到一组解后,将该解存储起来,在递归回溯到上一步时,继续寻找其他解。 最后,我们可以输出所有的解,即将存储解的数据结构打印出来即可。 总的来说,用Java实现n皇后问题的求解就是通过回溯算法来寻找可行解,并将找到的解存储起来并输出。具体实现中需要考虑如何判断当前位置是否可行、如何寻找下一行的合适位置等问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值