java数组实现N皇后问题
2015-04-01 10:57
316 查看
N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。
主要算法:回溯试探法
主要算法:回溯试探法
package com.coffee.queen; public class Nqueen { private int queenMax; private int []x ; // 解向量, i 行 x[i]列 private int resovedSum;// 当前得到的解的个数 private int mark;//记录遍历方案的序数 public Nqueen(int n){ resovedSum = 0; mark=1; x = new int [n+1]; queenMax=n; } public void backTrace(int t){//递归回溯 解法 if(t>queenMax){ //如果 算法到达n层 ,说明得到一个方案 方案数+1 resovedSum++; output(); System.out.println("----------------------"); } else{ //算法核心: 如果当前place 为false 进行下一个候选解 进行回溯 如果为true 扩大问题的候选解规模, 进行试探 for(int i=1;i<=queenMax;i++){ //记录下当前位置 x[t]=i; //t行皇后在位置i if(place(t)){//如果t行成功 放置t+1行 扩大规模 进行试探 backTrace(t+1); } } } } public boolean place(int t){ if(t==1){ return true; } for(int j=1;j<t;j++){//遍历前排,比较已经放置的皇后 if((Math.abs(t-j)==Math.abs(x[t]-x[j]))||(x[j]==x[t])){ return false; //在对角线上或者 同行 同列 返回true; } } return true; } public void output(){ for(int i=1;i<x.length;i++){ System.out.println("皇后"+i+"在第"+i+"行"+x[i]+"列"); } } public static void main(String[] args) { Nqueen nqueen = new Nqueen(6); nqueen.backTrace(1); System.out.println("一共有"+nqueen.resovedSum+"种解法"); } }
相关文章推荐
- 数组实现的约瑟夫问题(Java)
- n皇后问题(人工智能试验java实现)
- 数组实现的约瑟夫问题(Java)
- n皇后问题java递归实现
- 从n个数组中任意选取一个元素的所有组合的Java实现(组合问题)
- 回溯法求解 “n 皇后 问题”——Java 实现
- 回溯法求解N皇后问题(Java实现)
- N皇后问题java实现
- 数组问题之一维最大字段和问题<Java实现>
- 数组问题之数组最值问题<Java实现>
- java实现N皇后问题
- java实现回溯法解n皇后问题
- 一维数组及子数组最大和问题Java实现
- java 实现后缀数组及最长回文子串问题
- N皇后问题 位运算解法【JAVA实现】
- 01背包问题-状态d[i][j],f[i][j],滚动数组--java实现
- 最大子数组问题分治法(递归)Java实现
- (旋转数组问题)给定一个整数类型的循环有序数组,求循环数组的特定值,使用二分查找法(JAVA实现)
- 八皇后问题,Java实现,可推广解决N皇后问题
- java实现八皇后的排列问题