日期:2014-05-20  浏览次数:20588 次

关于八皇后问题
有兴趣的朋友可以讨论下,八皇后问题怎么样才能尽可能少的减少资源的使用,还有就是大家说说解答的思路,我觉得思路比直接贴代码好多了

------解决方案--------------------


// 我的想法是吧8*8的棋盘看成8层 每层8个可选的值,然后对所有可能进行检查
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0);// temp
list.add(1);// <--从1开始传入
// 其实八皇后的问题只需要解析前面4个值就可以了,我发现八皇后的解是对称的
// 比如说这个1,5,8,6,3,7,2,4 用9依次相减得到 9-1=8,9-5=4,1,3,6,2,7,5这个就是8开头的其中的一个解了
for (int i = 1; i < 9; i++) {
list.set(1, i);
test(list, 2);
}
}

// result 用于存储已选结果 l为目标层数
public static void test(List<Integer> result, int l) {
if (l != 9) {
List<Integer> list = null;
list = check(result, l);
if (list != null && !list.isEmpty()) {
// 目标层数加1
l++;
// 遍历可选list
for (int i = 0; i < list.size(); i++) {
List<Integer> newResult = new ArrayList<Integer>();
newResult.addAll(result);
newResult.add(list.get(i));
test(newResult, l);
}
}
}
}

// 检查函数
// 对已有结果进行解析,得出新的可选参数,返回的list就是新的可选项
// 比如说第一层选了1那么目标层就是2,第二层能选的结果就是3,4,5,6,7,8 然后通过循环吧结果作为新的result传进去
public static List<Integer> check(List<Integer> result, int l) {
int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
for (int i = 1; i < l; i++) {
int index = result.get(i);
if (a[index] != 0) {
a[index] = 0;
}
int t = 0;
if ((t = index - (l - i)) > 0) {
a[t] = 0;
}
if ((t = index + (l - i)) < 9) {
a[t] = 0;
}
}
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < a.length; i++) {
if (a[i] != 0) {
list.add(a[i]);
}
}
return list;
}