Java:八皇后问题

** 八皇后问题(英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题
是回溯算法的典型案例。问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,
即任意两个皇后都不能处于同一行、同一列或同一斜线上
思路:
1,我们首先先创建一个棋盘,用一维数组来存放,其下标表示横坐标,其下标对应的值表示纵坐标
2,我们首先把第一个皇后放到第一行第一列,然后再把第二个皇后放到第二行中的第一列,以此试探到最后一列看那个位置满足
3,回溯从最后一个位置向上一个位置回溯来确定下一次符合的位置
4,最后打印出来**

/**
 * 数组下标表示横坐标,下标对应的值是纵坐标
 * @author chenqian
 * @time:
 * @功能:八皇后问题
 */
public class Queen_1 {
	static int count = 0;
    int max = 8;
    
    int array[] = new int[8];//存放八皇后问题的解法
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Queen_1 q = new Queen_1();
		q.place(0);
		System.out.println("一共有 " + count + "种方法");

	}
	//放置皇后
	public void place(int n) {
		if(n == 8)
		{
			print();
			return;
		}
		//试探确定位置
		for(int i = 0;i < max;i ++)
		{
			array[n] = i;//放置皇后
			if(judge(n))//判断这个位置是否合适
			{
				place(n + 1);
			}
		}
	}
	//判断放置的第n个皇后和前面的是否冲突:和前面的不在同一列 array[n] != array[i],因为斜线的直线方程可以抽象为y = x 所以  n 和前面皇后的横坐标的差的绝对值 == 纵坐标的绝对值则在同一条线上
	public boolean judge(int n) {
		for(int i = 0;i < n;i ++)
		{
			if(array[n] == array[i] || Math.abs(n - i) == Math.abs(array[n] - array[i]))
			{
				return false;
			}
			
		}
		return true;
		
	}
	//打印解法
	public void print() {
		count ++;
		for(int i = 0;i < array.length;i ++) {
			System.out.print(array[i] + "\t");
		}
		System.out.println();
			
	}

}

你可能感兴趣的:(java数据结构)