穷举法和回溯法求解八皇后

八皇后是数学家高斯提出的趣题,即在国际象棋中8*8的方格的棋盘上如何放置8个皇后,使得8个皇后任何2个不能互相攻击(即不能同一纵列,不能统一横排,不能在45度斜线上)。
以下是我自己用java写的 穷举法和回溯法求八皇后。

//穷举法列出八皇后的可能性
//yuyong 2012-4-1
public class QjfBhh {

public static void main(String[] args) {
List<Integer> results = new ArrayList<Integer>();
int count = 0;

long from=System.currentTimeMillis();

for (int start = 12345678; start <= 87654321; start += 9) {
if (calculate(String.valueOf(start))) {
results.add(start);
count++;
}
}

long end=System.currentTimeMillis();

for (Integer value : results) {
System.out.println(value);
}

System.out.println("共 "+count+" 个,共耗时 "+(end-from)+" 毫秒");
}

private static boolean calculate(String str){
for(int i=0;i<str.length();i++){
if(str.charAt(i)=='0'||str.charAt(i)=='9')
return false;
for(int j=0;j<i;j++){
if(str.charAt(i)==str.charAt(j))
return false;
if(Math.abs((i-j))==Math.abs((str.charAt(i)-str.charAt(j))))
return false;
}
}

return true;
}

}


因为不能统一横排或者纵排,所以8位数字中1到8肯定各出现一次,不可以重复。所以范围规定于[12345678,87654321] 并且穷举的步长为9,因为数字1-8各出现一次,所以,8位数字肯定为9的倍数.


//回溯法求解八皇后
//yuyong 2012-4-1
public static void main(String[] args) {
List<String> results = new ArrayList<String>();
long from=System.currentTimeMillis();
List<Integer>indexs=new ArrayList<Integer>();
for(int i=0;i<=7;i++)
indexs.add(-1);
int current=-1;
while(true){
//第一个皇后也无法满足条件时
if(current==-1&&(indexs.get(0)==7))
break;
current++;

//当前皇后已经无法满足条件时
if(indexs.get(current)==7){
indexs.set(current, -1);
current=current-2;
continue;
}

indexs.set(current, indexs.get(current)+1);

for(int j=0;j<current;j++){
if((indexs.get(current)==indexs.get(j))||(Math.abs((current-j))==Math.abs((indexs.get(current)-indexs.get(j))))){
if(indexs.get(current)==7){
indexs.set(current, -1);
current=current-2;
break;
}else{
current=current-1;
break;
}
}
}

//8个皇后均满足条件时
if(current==7){
results.add(indexs.toString());
current=current-1;
}

}

long end=System.currentTimeMillis();
for (String value : results) {
System.out.println(value);
}

System.out.println("共 "+results.size()+" 个,共耗时 "+(end-from)+" 毫秒");
}

回溯法求解八皇后,思路是,当前位的皇后数字都无法满足条件时,就回溯到上一个皇后位置,上一个皇后,达到满足条件时,继续下一个皇后的列举判断。直到第一个皇后都无法满足条件为止。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值