NPC问题——回溯算法、聚类分析

public class queen { 
	private int[] box;//检查同行和同列是否有Q
	private int[] rl; //检查左下和右上是否有Q
	private int[] lr; //检查左上和右下是否有Q
	private int[] queen; //解答
	private int num; // 解答编号 
	public  queen() { //构造函数
		
	box = new int[8+1];	
	lr = new int[2*8+1]; 
	rl = new int[2*8+1]; 
	for(int i = 1; i <= 8; i++) 
		box[i] = 1; 
	for(int i = 1; i <= 2*8; i++)
	
		lr[i] = rl[i] = 1; 
	queen = new int[8+1]; 
	} 
	public void backtrack(int i) //确定位置
	{ if(i > 8) { show(); } 
	else { 
		for(int j = 1; j <= 8; j++) 
		{ if(box[j] == 1 && lr[i+j] == 1 && rl[i-j+8] == 1) 
		{ queen[i] = j; // 设定为占用 
		box[j] = lr[i+j] = rl[i-j+8] = 0;
		backtrack(i+1); 
		box[j] = lr[i+j] = rl[i-j+8] = 1; } } } }
	protected void show() //显示解答
	{
		
		num++;
		if(num>=4)
		{
			return;
		}else
		{
			System.out.println("\n解答 :" + num);
			
			
			for(int y = 1; y <= 8; y++)
				
			{ 
				for(int x = 1; x <= 8; x++) 
			{ if(queen[y] == x) 
			{ System.out.print(" Q"); } 
			else { System.out.print(" x"); } }
			System.out.println(); 
			} 
		}
		
	}
	public static void main(String[] args) 
	{ queen queen = new queen(); queen.backtrack(1); }
}


参考程序:百度百科“皇后问题”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值