八皇后问题及其优化
2017-05-14 20:58
197 查看
在棋盘上放置8个皇后,使得它们互不攻击,此时每个皇后的攻击范围为同行同列和同对角线,要求找出所有解,一个很简单的排列组合问题,每行每列每斜列只能有一个皇后
优化后
在优化
/** * Created by max on 17-5-14. */ public class EightQueen { private static byte[][] map; static int key = 0; static byte[] row = new byte[8]; static int[] answer = new int[8]; public static void main(String[] args) { map = new byte[8][8]; location(0); } public static void location(int column) { if (column==8) { for (int i = 0 ;i<8;i++) System.out.print(" " + answer[i]); System.out.println(" "); return; } for (int i = 0;i<8 ;i++) { if (i!= 0) map[i-1][column] = 0; if (row[i] == 1) continue; row[i] = 1; answer[column] = i; if (attack(i,column)) { location(column+1); } if (i==7) map[7][column] = 0; row[i] = 0; } } public static boolean attack(int x,int y) { int i = 0; while(x+i<8&&y+i<8) { if (map[x+i][y+i] ==1) { return false; } i++; } i = 0; while(x-i>=0&&y-i>=0) { if (map[x-i][y-i] == 1) { return false; } i++; } i = 0; while (x-i>=0&&y+i<8) { if (map[x-i][y+i] == 1) { return false; } i++; } i = 0; while (x+i<8&&y-i>=0) { if (map[x+i][y-i] == 1) { return false; } i++; } i = 0; while(i<8) { if (map[x][i]==1||map[i][y]==1) { return false; } i++; } map[x][y] = 1; return true; } }
优化后
/** * Created by max on 17-5-14. */ public class EightQueenBetter { static int row[] = new int[8]; public static void main(String[] args) { search(0); } static void search(int row_number) { if (row_number == 8) { for (int i = 0 ;i<8;i++) System.out.print(" "+row[i]); System.out.println(""); return; } for (int i =0 ;i<8;i++) { boolean ok = true; row[row_number] = i; for (int j = 0 ;j<row_number;j++) { if (row[row_number]==row[j]||row_number-row[row_number]==j-row[j]||row_number+row[row_number]==j+row[j]) { ok = false; break; } } if (ok) search(row_number+1); } } }
在优化
private static byte[][] accupied = new byte[3][15]; static void search2(int column) { if (column==8) { showAnswer(); return; } for (int i = 0;i<8;i++) { if (accupied[0][i]==0&&accupied[1][column+i]==0&&accupied[2][7-column+i]==0) { row[column] = i; accupied[0][i]=1; accupied[1][column+i]=1; accupied[2][7-column+i]=1; search2(column+1); accupied[0][i]=0; accupied[1][column+i]=0; accupied[2][7-column+i]=0; } } }
相关文章推荐
- F2FS文件系统实现分析及其在移动设备上的优化
- reflow(回流)和repaint(重绘)及其优化
- spark内核揭秘-14-Spark性能优化的10大问题及其解决方案
- Android_Adapter,Spanner,listView及其优化
- CSS精灵技术及其优化经验分享
- 快速排序算法及其优化方法
- dijkstra算法及其堆优化
- KMP算法及其优化算法
- Android-布局的优化及其使用
- 快速排序及其优化
- C++实现 八皇后问题及其扩展N皇后问题(经典回溯算法)
- 图像算法移植到DSP及其优化步骤
- Hibernate优缺点及其优化方法
- 【Algorithm】一般约束优化问题——PHR算法及其Matlab实现
- 筛法求素数及其优化
- 最大子序列和问题 二维最大子序列核问题及其优化
- Handler可能导致的内存泄漏及其优化
- Space Shooter之随机生成敌人及其优化
- 选择排序及其优化
- MySQL 子查询及其优化