leetcode: N-Queens

本文介绍了一种解决N皇后问题的算法实现,采用迭代而非传统的递归方式。通过定义一个trace数组来记录每行皇后的位置,并使用conflict函数检查皇后间是否存在冲突。该算法能够找出所有可行的解决方案。

这道题的话以前的解法是递归,不过其实也可以写在一个函数里。

trace[i]表示第i行的皇后放置的位置,判断这个位置与之前的皇后是否冲突,用conflict函数检查。

x表示当前枚举到第几行,初始的时候trace[x]为-1,以后都是从trace[x]+1的位置枚举第x行皇后新的位置。

如果第x行能放皇后:

1.x不为最后一行的话,就继续到第x+1行;

2.x为最后一行,保存这一次的结果,继续回到最后一行,枚举trace[n-1]+1的位置,it‘s another story

如果第x行的所有位置都冲突了:

1.返回第x-1行,将trace[x]重新设为-1.

public class Solution {
   public static ArrayList<String[]> solveNQueens(int n) {
		int[] trace=new int[n];
		int i,j,x;
		ArrayList<String[]> rst=new ArrayList<String[]>();
		String[] B=null;
		char[] Bline=new char[n];
		
		for(i=0;i<n;i++)
		{
			trace[i]=-1;
			Bline[i]='.';
		}
		
		
		i=0;x=0;
	    while(true)
	    {
	    	if(x<0)
	    		break;
	    	//find another suitble postion in col x
	    	for(j=trace[x]+1;j<n;j++)
	    	{
	    		trace[x]=j;
	    		if(conflict(trace,x)==false)
	    			break;
	    	}
	    	//no suitble postion in col x;
	    	if(j==n)
	    	{
	    		x=x-1;trace[x+1]=-1;continue;
	    	}
	    	//find pos
	    	else
	    	{
	    		x=x+1;
	    		//last col
	    		if(x==n)
	    		{
	    			B=new String[n];
	    			for(i=0;i<n;i++)
	    			{
	    				Bline[trace[i]]='Q';
	    				B[i]=new String(Bline);
	    				Bline[trace[i]]='.';
	    			//	System.out.println(B[i]);
	    			}
	    			rst.add(B);
	    			x--;
	    			continue;
	    		}
	    		//next col
	    	}
	    }
	    return rst;
	}
	
	public static boolean conflict(int[] trace ,int pos)
	{
		int i;
		for(i=0;i<pos;i++)
		{
			if(trace[i]==trace[pos] || Math.abs(trace[i]-trace[pos])==(pos-i))
				return true;
		}
		return false;
	}
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值