首页 > 代码库 > 八皇后
八皇后
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出。
问题描述:将八个皇后放在棋盘上,任何两个皇后都不能互相攻击(即没有任何两个皇后在同一行、同一列或者同一对角线上)。
现在把程序代码写在下方,
// 创建并初始化数组
int [] list = new int [arrSize];
for(int i = 0; i < arrSize; i++)
list[i] = i;
// 随机打乱数组
public static void randomizeArray(int [] list){
int arrSize = list.length;
int ranIndex;
for(int i = 0; i < arrSize; i++){
ranIndex = (int)(Math.random() * arrSize);
if(ranIndex != i){
int temp = list[i];
list[i] = list[ranIndex];
list[ranIndex] = temp;
}
}
}
public void solveEightQueens(){
int arrSize = 8;
int [] list = new int [arrSize];
for(int i = 0; i < arrSize; i++)
list[i] = i;
int count = 0;
boolean notValid = true;
while(notValid){
count ++;
notValid = false;
randomizeArray(list);
for(int i = 0; i < arrSize; i++){
for(int j = i + 1; j < arrSize; j++){
if(j - i == Math.abs(list[j] - list[i])){ // 检查是否满足条件
notValid = true;
break;
}
}
if(notValid) break;
} // end of outer for loop
} // end of while
// print the result
int i;
System.out.println("O(∩_∩)O哈哈~, I have tried " + count + " times, and eventually succeed.");
for(i = 0; i < arrSize - 1; i++){
System.out.print("(" + i + ", " + list[i] + "), ");
}
System.out.println("(" + i + ", " + list[i] + ")");
}
public static void solveEightQueensMethod(){
int start = 001234567; // 八进制
int end = 076543210; // 八进制
int count = 0; // 计算有效的布局数
for(int i = start; i < end; i++){
boolean isValid = isValid(i);
if(isValid){
if(++count % 7 == 0)
System.out.println(Integer.toOctalString(i) + ": " + isValid);
else System.out.print(Integer.toOctalString(i) + ": " + isValid + " ");
}
}
System.out.println("count = " + count); // 输出有效的布局数
}
// 检查 number 是否是有效布局
public static boolean isValid(int number){
String numOct = Integer.toOctalString(number);
int arrSize = numOct.length();
if(arrSize==7) { // 如果number第一位是0,则生成的字符串只有七个字符
numOct = ‘0‘ + numOct;
arrSize ++;
}
for(int i = 1; i < arrSize; i ++){
for(int j = i - 1; j >= 0; j--){
if(numOct.charAt(i) == numOct.charAt(j)) return false; // 同一列
if(i - j == Math.abs(numOct.charAt(i) - numOct.charAt(j))) return false; //同一条对角线
}
}
return true;
}
八皇后