八皇后问题,Java实现,可推广解决N皇后问题
2015-04-06 14:35
411 查看
八皇后问题是一个经典的回溯算法的问题。 八皇后问题说的是:国际象棋棋盘有8行8列,即8*8=64个单元格,现在在棋盘上排放八个皇后,使其不能互相攻击,就是说任意两个皇后都不能处于同行同列,或同一斜线上。问有多少钟摆法,摆放的方式为?N=8,(N>=4); 算法思路:棋盘可用二维数组构成,因为任意皇后不在同行,我们用一个一维数组position ,来保存每一行皇后的位置,就可避免在同一行。 具体流程如下: 1、首先在第一行某个位置放一个皇后; 2、接着在下一行放置第二个皇后,此时要逻辑判断是否与前面的皇后形成攻击,若不形成攻击则放置下一个皇后。 3、当放置完N个不形成攻击的皇后,就找到一个解,将其输出
下面给出完整代码:
public class Queen { static int N = 8; static int count = 0; static int[] position = new int ; static void outPut(){ int i, j; System.out.println("第"+(++count)+"种方法输出:"); for(i=0; i<N; i++){ for(j=0; j<N; j++){ if(position[i] == j){ System.out.print("0 "); //0代表皇后 }else{ System.out.print("* "); } } System.out.println(); } } static void eightQueen(int n){ int i, j; int ct; if(n == N){ outPut(); return; } for(i=0; i<N; i++){ position = i; //n代表第n行,i代表第n行皇后的位置 ct = 1; for(j=0; j<n; j++){ //第一个判断是否在同一列,第二个判断是否在正反斜线上 if(position ==position[j] || Math.abs(position[j]-position )==(n-j)) ct = 0; } if(ct == 1) //如果没有冲突,则向下一行递归 eightQueen(n+1); //这是向下一行递归,如果递归的结果是下一行的皇后无地方放,则回溯到n,i++一次,即本次第n行的皇后位置向后移一位 } } public static void main(String[] args) { System.out.println("请输入皇后N的个数:"); Scanner sc = new Scanner(System.in); N = sc.nextInt(); System.out.println(N+"皇后的放置方法有:"); eightQueen(0); } }
运行其中之一的结果为:
相关文章推荐
- 回溯法解决N皇后问题(java实现)
- 八皇后问题 java实现,算法两则
- n皇后问题(人工智能试验java实现)
- JAVA_解决实现接口方法重名问题
- N皇后问题java实现
- java代码中实现字符编码转换(解决中文乱码问题)
- AStar解决八数码问题(java实现)
- Java实现Zip压缩与解压(解决中文乱码问题)
- java实现RSS订阅包括解决中文出错问题
- javadbf 实现解决中文乱码问题
- 动态规划解决矩阵链乘问题的java编码实现
- 回溯法求解 “n 皇后 问题”——Java 实现
- 回溯法求解N皇后问题(Java实现)
- [转]在Java中实现.net中DataTable功能以及操作双数据库的List连接问题解决方案探究
- 八皇后问题的java实现
- java实现插入mysql二进制文件,blob类型,遇到问题及解决办法
- js,java实现escape()和unescape()函数解决以给方式提交中中文参数问题
- C#WPF实现回溯算法解决八皇后问题
- 八皇后问题(java解决)
- 在Java中实现.net中DataTable功能以及操作双数据库的List连接问题解决方案探究