[数据结构]递归-解决八皇后问题

八皇后问题介绍:

这是一段百度百科关于八皇后问题的介绍

此图来源于百度百科哈~~~

简单的来说就是有一个8*8的棋盘,需要将8颗代表皇后的棋子有规则地摆上。规则是任意两个皇后不能处在同一行,同一列或者同一斜线上,列出所有不同的解法。

解题思路:

1.第一个皇后放在第一排第一列。

2.第二个皇后放在第二行第一列,然后判断是否ok,如果不ok,继续放在第二列,第三列,依次把所有列都放完,直到找到一个合适的点。

3.继续第三个皇后,依旧按照第二点的原则,指导第八个皇后也存在一个不冲突的点,则算是找到了一个正确的解。

4.当得到一个正确的解时,在栈回退到上一个栈空间(这里所说的回退栈空间就是指回退到上一个皇后,然后将上一个皇后平移一个位置)开始回溯,直到第一个皇后,此时到第一排的第一个位置的所有解就都得到了。

5.最后就是第一个皇后放在第一排第二列...最后一列。

下面是代码实现:

设计一个类用来实现本次代码,利用数组的两个属性,(索引,值)即索引代表行数,指代表列数

    // 皇后的个数
	int max = 8;
	// 记录正确解的个数
	int count = 0;
	// 数组用来存放结果
	int[] arr = new int[max];

这里设计 三个方法,判断是否之前的皇后冲突的方法;输出方法;递归方法;

冲突方法主要是根据传进来的行号也就是数据的索引值,得到当前棋局中的皇后的具体位置,利用循环判断是否与之前的皇后位置冲突。

递归方法主要是设计一个打破递归的条件,即第八颗棋子也被安排了一个列数就是当递归调用本深的第八回。可以理解为一个数的结构当然这里不是指的二叉树,就是一个模拟的树结构,在每个分叉的分支均循环了八次。这样在每次找到最终解的时候都可以输出正确的解。

public void check(int n) {
		if (n == max) {
			show();
			return;
		}
		for (int i = 0; i < max; i++) {
			arr[n] = i;
			if (judge(n)) {
				check(n + 1);
			}
		}

	}

	// 判断当前皇后是否与之前的皇后冲突
	public boolean judge(int n) {
		for (int i = 0; i < n; i++) {
			// 数组中的值代表的是列数
			// n或者i代表的是行数 22 33 13 24
			if (arr[i] == arr[n] || Math.abs(n - i) == Math.abs(arr[n] - arr[i])) {
				return false;
			}
		}
		return true;
	}

	// 输出当前数组的方法
	public void show() {
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
		count++;
		System.out.println();
	}

最后时程序的运行结果:

 

猜你喜欢

转载自blog.csdn.net/we1less/article/details/106222303
今日推荐