首页 > 代码库 > 回溯(su)算法之N皇后问题
回溯(su)算法之N皇后问题
这里回溯算法还要好好研究一下
试探一个位置是否有效,如果有效,试探下一个位置(DFS),如果无效则回退
1.定义一个解空间,存放一个解的空间
2.DFS(暂且认为是DFS)
这里N皇后用的是递归+回溯实现的
1 package com.gxf.backtracking; 2 3 /** 4 * n皇后问题 5 * @author Administrator 6 * 7 */ 8 public class Queen { 9 int num_queen; //皇后个数10 int solution[]; //solution[i] = k表示第i行皇后在第k列 ,solution为解空间11 int sum = 0;12 13 public Queen(int num){14 num_queen = num;15 solution = new int[num_queen + 1];16 }17 18 /**19 * 第k个皇后的位置是否有效20 * 第k个皇后的列保存在solution[k]中,与前面k-1个皇后比较21 * @param k22 * @return23 */24 boolean isValid(int k){25 for(int i = 1; i < k; i++){26 if(solution[i] == solution[k] || Math.abs(k - i) == Math.abs(solution[k] - solution[i]))27 return false; 28 }29 return true;30 }31 32 /**33 * 开始放第n个皇后34 * @param queen35 */36 public void placeQueen(int n){37 if(n > num_queen)38 {39 showSolution();40 System.out.println();41 sum++;42 }43 else44 for(int i = 1; i <= num_queen; i++){45 solution[n] = i; //n个皇后放到i列 46 if(isValid(n))47 placeQueen(n + 1);48 }49 }50 51 /**52 * 将结果打印出来53 */54 public void showSolution(){55 for(int i = 1; i <= num_queen; i++){56 for(int j = 1; j <= num_queen; j++){57 if(j == solution[i])58 System.out.print(‘Q‘ + " ");59 System.out.print(0 + " ");60 }61 System.out.println();62 }63 }64 65 public static void main(String[] args) {66 Queen queen = new Queen(4);67 68 queen.placeQueen(1);69 System.out.println("sum = " + queen.sum);70 }71 72 }
回溯(su)算法之N皇后问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。