算法之5--回溯法解决八皇后问题

关键点:

1.判断条件的书写

2.横向走和纵向走,往回走的控制条件就是,

当满足条件,且还没走到底(N),纵向走(此时continue,可以有可能一直走到底)

当不满足条件,横向还没走到底,横向走

当不是第一行的列是最后一列的时候,往回走(此时可以判断是第一行在最后一列的话,可以退出循环,直接break掉)


代码如下:

public class queen {
	/**
	 * @param args
	 * 回溯法解决n皇后问题
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//这边以八皇后为例子
		int n=8;
		//定义一个数组,用来存放第i行的列值
		int a[]=new int[20];
		a[1]=1;
		//定义一个while循环,用来查找所有的符合八皇后的解
		int i=1;
		int s=0;
		while(true){
			//先判断是不是重复
			//定义不合适标志
			int flag=0;
			for(int k=i-1;k>=1;k--)
			{
				int x=a[i]-a[k];
				if(x<0){
					x=-x;
				}
				int cha=i-k;
				if(a[i]==a[k] || cha==x)
				{
					flag=1;//表示不合适
				}
			}
			//当合适的时候,深度优先搜索,这边开始做的时候想不明白,如何控制横向加1还是纵向加1,这边就是当第i行的列满足的时候,i++重新退回循环
			//直接continue掉
			if(flag==0 && i<n)
			{
				i++;
				a[i]=1;
				continue;
			}
			if(i==n && flag==0)
			{
				for(int j=1;j<=n;j++)
				{
					System.out.print(a[j]);
				}
				System.out.print(" ");
				s++;
				if(s%5==0)
				{
					System.out.println(" ");
				}
			}
			///回溯
			while(a[i]==n && i>1)//控制回溯的条件,当不是第一行到达最后一列的时候,这边其实我觉得有个想法在里面,就是当第i行(i>1)是最后一列的时候,就不应该在往下做了,应该往回走
				//就是当我这一行已经走到最后一列的时候,应该往回走了,不要在往下判断了
			{
				i--;
			}
			if(a[i]==n && i==1)
			{
				break;
			}else{//当不是第一行的最后一列的时候,横向加1
				a[i]=a[i]+1;
			}
		}
		System.out.println(s+"个数");
	}
}
输出结果:

15863724 16837425 17468253 17582463 24683175  
25713864 25741863 26174835 26831475 27368514  
27581463 28613574 31758246 35281746 35286471  
35714286 35841726 36258174 36271485 36275184  
36418572 36428571 36814752 36815724 36824175  
37285146 37286415 38471625 41582736 41586372  
42586137 42736815 42736851 42751863 42857136  
42861357 46152837 46827135 46831752 47185263  
47382516 47526138 47531682 48136275 48157263  
48531726 51468273 51842736 51863724 52468317  
52473861 52617483 52814736 53168247 53172864  
53847162 57138642 57142863 57248136 57263148  
57263184 57413862 58413627 58417263 61528374  
62713584 62714853 63175824 63184275 63185247  
63571428 63581427 63724815 63728514 63741825  
64158273 64285713 64713528 64718253 68241753  
71386425 72418536 72631485 73168524 73825164  
74258136 74286135 75316824 82417536 82531746  
83162574 84136275 92个数




猜你喜欢

转载自blog.csdn.net/zhangchun888/article/details/50197529