用Java实现一些常见的问题
2015-07-13 10:32
591 查看
八皇后
public class EightQueen { private static final int ROW = 4; private static final int COL = 4; private static int count = 0; // 八皇后的解的个数 private static boolean[][] maps = new boolean[ROW][COL]; // 初始化二维数组,模拟8*8棋盘,默认值是false表示没有皇后 // 如何去放皇后? /** * 放置第row行的皇后 * @param row 从第0行开始放皇后 */ public static void putQueen(int row) { // 递归的出口 if (row == ROW) { // row=8时,已经到了第9行,那么前面的8行就是OK的 printQueen(); return; } // 把皇后放到第row行的第j列 for (int j = 0; j < COL; j++) { // 如果可以放,就将皇后放在该点 if (isOK(row, j)) { maps[row][j] = true; putQueen(row + 1); // 该行放好之后放下一行【递归去放皇后】,算法已经跳转 maps[row][j] = false; // 回溯,当放row+1行棋子不满足的时候,会回溯到第row行 } } } // 如果要将皇后放在(x,y)点,则需要先判断该点是否可以放 public static boolean isOK(int x, int y) { // 遍历二维数组,判断4个方向是否存在皇后 for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { // 正斜边x-y定值,逆斜边x+y为定值 if (i == x || j == y || i - j == x - y || i + j == x + y) { // 判断4个方向是否存在皇后 if (maps[i][j]) { // 如果该点放了一个皇后,则返回false return false; } } } } return true; } public static void printQueen() { System.out.println("第" + (++count) + "个解"); System.out.println("*******************"); for (int i = 0; i < ROW; i++) { for (int j = 0; j < COL; j++) { if (maps[i][j]) { System.out.print("Q "); } else { System.out.print("* "); } } System.out.println(); } } /** * 穷举法求4皇后 */ private static void Queen(){ for(int i = 0;i < 4;++i) for(int j = 0;j < 4;++j) for(int k = 0;k < 4;++k) for(int m = 0; m < 4;++m) if (!conflusion(i,j,k,m)){ System.out.println("["+i+","+j+"," + k + "," + m +"]"); } } private static boolean conflusion(int i, int j, int k, int m) { return j == i || k == i || m == i || k == j || m == j || k == m || Math.abs(i - j) == 1 || Math.abs(i - k) == 2 || Math.abs(i - m) == 3 || Math.abs(j - k) == 1 || Math.abs(j - m) == 2 || Math.abs(k - m) == 1; } public static void main(String[] args) { System.out.println("回溯法求解4皇后"); putQueen(0); // 从第0行开始放皇后 System.out.println("穷举法求解4皇后"); Queen(); } }
相关文章推荐
- 离线使用eclipse的代码提示功能
- Java报表生成技术
- Java-文件上传和下载
- MyEclipse 打开Struts配置文件时出错
- java算法学习
- Java Collections工具类
- ubuntu jdk1.7 安装
- [LeetCode][Java] Sudoku Solver
- 深入研究java.lang.Class类
- JAVA集合学习之——Properties类
- Java中的位运算符与基本数据类型
- eclipse常用快捷键
- java并发库之Executors常用的创建ExecutorService的几个方法说明
- java中的堆、栈、常量池
- 深入研究java.lang.ThreadLocal类
- Myeclipse快捷键大全
- spring mvc 异常统一处理方式
- Java调试
- Java 中的关键字 synchronized详解
- java与c#的区别(一)