N皇后问题利用回溯法求解

package queen;

import java.util.Arrays;

/**
 * n皇后问题
 * 在一个nxn的表格中,放n个皇后,要求没个皇后之间不能位于同一列,同一行,同一对角线上。
 * 求解思路:最容易想到的方法就是有序地从第 1 列的第 1 行开始,尝试放上一个皇后,
 * 然后再尝试第 2 列的第几行能够放上一个皇后,如果第 2 列也放置成功,
 * 那么就继续放置第 3 列,如果此时第 3 列没有一行可以放置一个皇后,说明目前为止的尝试是无效的(即不可能得到最终解),
 * 那么此时就应该回溯到上一步(即第 2 步),
 * 将上一步(第 2 步)所放置的皇后的位置再重新取走放在另一个符合要求的地方…如此尝试性地遍历加上回溯,
 * 就可以慢慢地逼近最终解了。*/
public class Queen {
	private  int n=0;//解的个数
	private int number;//皇后个数
	private int []location;//表示么行么个位置有皇后,如location[1]=2代表第二行第三个位置有皇后
	
	public Queen(int number){
		this.number=number;
		location=new int[number];
	}
	
	/**
	 * 判断第row行的第lacationNum位置能不能放皇后,
	 * 如果能,则返回true
	 * 否则 返回false
	 * */
	public boolean isCanPutQueen(int row,int locationNum){
		//如果是放在第一行,则随便放
		if(row==0){
			return true;
		}
		//经过分析,两个皇后满足规则的前提:列不能相同,行不能相同,并且行坐标只差等于纵坐标只差的绝对值,
		//由于我已定位每行放一个皇后,则“行不能相同”这个条件可以忽略
		for(int i=0;i=0){
			 //遍历改行的列
			 for(int j=col;j
package queen;

import java.util.Arrays;

public class QueenDemo {
	public static void main(String[] args) {
		Queen q=new Queen(8);
		q.putQueen();
		System.out.println("解的个数为:"+q.getN());
 }
}


你可能感兴趣的:(算法)