Recursion 八皇后问题 @CareerCup
2013-11-27 10:18
281 查看
递归+回溯,不多说了。唯一要注意的是在每次记录一个可行的方案时,要复制一份数组,在Java中可以通过
1 循环复制
2 clone() 方法
3 System.arraycopy() 方法
这里按照书上,用了clone()方法!
package Recursion;
import java.util.ArrayList;
/**
* Write an algorithm to print all ways of arranging eight queens on a chess board so that none of them share the same row, column or diagonal.
译文:
经典的八皇后问题,即在一个8*8的棋盘上放8个皇后,使得这8个皇后无法互相攻击( 任意2个皇后不能处于同一行,同一列或是对角线上),输出所有可能的摆放情况。
*
*/
public class S9_9 {
public static int GRID_SIZE = 8;
public static void main(String[] args) {
ArrayList<Integer[]> results = new ArrayList<Integer[]>();
Integer[] columns = new Integer[GRID_SIZE];
clear(columns);
placeQueens(0, columns, results);
printBoards(results);
System.out.println(results.size());
}
// column = columns[row]
public static void placeQueens(int row, Integer[] columns, ArrayList<Integer[]> results) {
if(row == GRID_SIZE){
results.add(columns.clone()); // 注意这里要做一个复制!
return;
}
for(int col=0; col<GRID_SIZE; col++){
if(isValid(row, col, columns)){
columns[row] = col;
placeQueens(row+1, columns, results);
columns[row] = -1;
}
}
}
public static boolean isValid(int row, int col, Integer[] columns){
if(columns[row] != -1){
return false;
}
for(int r=0; r<row; r++){
if(columns[r] == col){
return false;
}
if(Math.abs(r-row) == Math.abs(columns[r]-col)){
return false;
}
}
return true;
}
public static void clear(Integer[] columns) {
for (int i = 0; i < GRID_SIZE; i++) {
columns[i] = -1;
}
}
public static void printBoards(ArrayList<Integer[]> boards) {
for (int i = 0; i < boards.size(); i++) {
Integer[] board = boards.get(i);
printBoard(board);
}
}
public static void printBoard(Integer[] columns) {
System.out.println("-----------------");
for(int i = 0; i < GRID_SIZE; i++){
System.out.print("|");
for (int j = 0; j < GRID_SIZE; j++){
if (columns[i] == j) {
System.out.print("Q|");
} else {
System.out.print(" |");
}
}
System.out.println("\n-----------------");
}
System.out.println("");
}
}
1 循环复制
2 clone() 方法
3 System.arraycopy() 方法
这里按照书上,用了clone()方法!
package Recursion;
import java.util.ArrayList;
/**
* Write an algorithm to print all ways of arranging eight queens on a chess board so that none of them share the same row, column or diagonal.
译文:
经典的八皇后问题,即在一个8*8的棋盘上放8个皇后,使得这8个皇后无法互相攻击( 任意2个皇后不能处于同一行,同一列或是对角线上),输出所有可能的摆放情况。
*
*/
public class S9_9 {
public static int GRID_SIZE = 8;
public static void main(String[] args) {
ArrayList<Integer[]> results = new ArrayList<Integer[]>();
Integer[] columns = new Integer[GRID_SIZE];
clear(columns);
placeQueens(0, columns, results);
printBoards(results);
System.out.println(results.size());
}
// column = columns[row]
public static void placeQueens(int row, Integer[] columns, ArrayList<Integer[]> results) {
if(row == GRID_SIZE){
results.add(columns.clone()); // 注意这里要做一个复制!
return;
}
for(int col=0; col<GRID_SIZE; col++){
if(isValid(row, col, columns)){
columns[row] = col;
placeQueens(row+1, columns, results);
columns[row] = -1;
}
}
}
public static boolean isValid(int row, int col, Integer[] columns){
if(columns[row] != -1){
return false;
}
for(int r=0; r<row; r++){
if(columns[r] == col){
return false;
}
if(Math.abs(r-row) == Math.abs(columns[r]-col)){
return false;
}
}
return true;
}
public static void clear(Integer[] columns) {
for (int i = 0; i < GRID_SIZE; i++) {
columns[i] = -1;
}
}
public static void printBoards(ArrayList<Integer[]> boards) {
for (int i = 0; i < boards.size(); i++) {
Integer[] board = boards.get(i);
printBoard(board);
}
}
public static void printBoard(Integer[] columns) {
System.out.println("-----------------");
for(int i = 0; i < GRID_SIZE; i++){
System.out.print("|");
for (int j = 0; j < GRID_SIZE; j++){
if (columns[i] == j) {
System.out.print("Q|");
} else {
System.out.print(" |");
}
}
System.out.println("\n-----------------");
}
System.out.println("");
}
}
相关文章推荐
- Recursion 爬楼梯问题 @CareerCup
- Recursion 叠箱子最高问题 @CareerCup
- Recursion 硬币组合问题 @CareerCup
- Recursion 二维空间里机器人向右或向下走的所有路径问题 @CareerCup
- Recursion 计算表达式的括号组合 @CareerCup
- Recursion 图像软件中的“填充”函数 @CareerCup
- CareerCup chapter 8 Recursion
- Stack_Queue 汉诺塔Hanoi问题 @CareerCup
- Recursion 在数组中寻找神奇下标 @CareerCup
- CareerCup之1.8 字符串移位包含问题
- Recursion 求所有子集 @CareerCup
- Stack_Queue 猫狗队列问题 Cat dog queue @CareerCup
- Recursion 字符串的全排列 String Permutation @CareerCup
- Recursion n对括号的组合 @CareerCup
- UVa 167 - The Sultan's Successors, 八皇后问题
- 数据结构41:回溯法解决八皇后问题
- 八皇后问题(递归版)
- 八皇后问题:递归和非递归解法
- 八皇后问题解析
- 八皇后问题,C++实现