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)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值