题目:
在8*8的国际象棋上摆放八个皇后,使其不能相互攻击。即任意两个皇后不得处在同一行、同一列或者同一条对角线上。
思路:
由于8个皇后任意两个不能处在同一行,那么肯定一行只有一个皇后。于是我们定义数组array【8】,数组中第i个数字表示第I行皇后所在列数。先把数组的八个数字分别用0~7初始化,然后对数组进行全排列。由于已经避免了同行同列,只要保证不在同一条对角线即可,
即i-j!=array[i]-array[j]&&j-i!=array[i]-array[j].
import java.util.ArrayList;
public class Solution {
//八皇后问题
public static ArrayList<ArrayList<Integer>> getList(int[] array)
{
if (array==null||array.length==0)
return null;
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
int pos = 0;
getList_helper(array,list,pos);
return list;
}
public static void getList_helper(int[] array,ArrayList<ArrayList<Integer>> list,int pos)
{
if (pos==7){
ArrayList<Integer> Array = new ArrayList<>();
for (int value : array) {
Array.add(value);
}
//System.out.println(Array.toString());
boolean isRightNode = isRightNode(Array);
if (isRightNode)
list.add(Array);
return;
}
for (int i = pos; i <8 ; i++) {
int temp = array[pos];
array[pos] = array[i];
array[i] = temp;
getList_helper(array,list,pos+1);
temp = array[pos];
array[pos] = array[i];
array[i] = temp;
}
}
public static boolean isRightNode(ArrayList<Integer> Array)
{
boolean res = true;
if (Array.size()!=8)
return false;
for (int i = 0; i <7 ; i++) {
for (int j = i+1; j <8 ; j++) {
if (i - j == Array.get(i) - Array.get(j) || j - i == Array.get(i) - Array.get(j)) {
res = false;
break;
}
}
}
return res;
}
}
本文介绍了一种解决八皇后问题的方法,通过使用全排列和数组记录每个皇后的位置,确保任意两个皇后不在同一行、列或对角线上。文章提供了一个Java实现的例子,包括递归辅助函数和验证解决方案正确性的函数。
3705

被折叠的 条评论
为什么被折叠?



