相信很多人听说过 八皇后算法,估计真正动手敲得不多... 啥也不说了 直接上代码: /** * 老生常谈的八皇后 20090704 * * @author 懒骨头 */ public class EightQueenOKOK { static int num = 0;// 正解的个数 static int size = 8;// 棋盘格数 static int[][] chess = new int[size][size];// 棋盘状态 void init() {// 初始化棋盘,开始为0,无效位置为1,有效位置为2 for (int i = 0; i < size; i++) for (int j = 0; j < size; j++) chess[i][j] = 0; } void show(int[][] _chess) {// 画棋盘 System.out.println(num); for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) System.out.print(_chess[i][j] + " "); System.out.println(); } } void copyA2B(int[][] a, int[][] b) {// 拷贝数组 for (int i = 0; i < size; i++) System.arraycopy(a[i], 0, b[i], 0, a.length); } void change(int[][] tmp2, int row, int col) {// 根据给定的点,筛选不合要求的点 for (int i = 0; i < size; i++) {// 把当前位置的所在行列全置为1 tmp2[i][col] = tmp2[row][i] = 1; } for (int i = 0; i < size; i++) {// 把当前位置的所在对角线全置为1 for (int j = 0; j < size; j++) if (i + j == row + col || i - j == row - col) tmp2[i][j] = 1; } tmp2[row][col] = 2;// 当前位置放皇后,置为2 } void start(int row, int[][] tmp1) {// 拯救皇后任务开始 if (row == size) {// size(8)个皇后全部放置,则找到一个正解 num++; show(tmp1); } else for (int i = 0; i < size; i++) if (tmp1[row][i] == 0) { int[][] tmp2 = new int[size][size]; copyA2B(tmp1, tmp2);// 复制数组 change(tmp2, row, i);// 根据给定的点,筛选不合要求的点 start(row + 1, tmp2);// 递归调用 } } public static void main(String args[]) { EightQueenOKOK eq = new EightQueenOKOK(); eq.init(); eq.start(0, chess); } }