"八皇后"问题的解法(1)
2015-05-21 16:36
99 查看
最近准备整理5种常见的"八皇后"问题的解法,这是第一篇,用递归方法求解。
简单介绍下"八皇后"问题:如何在8*8棋盘上无冲突放置8个皇后,无冲突可按如下理解(1)任何水平或竖直方向不能再有其他皇后;(2)正负45‘方向不能再有皇后;
源代码如下:
简单介绍下"八皇后"问题:如何在8*8棋盘上无冲突放置8个皇后,无冲突可按如下理解(1)任何水平或竖直方向不能再有其他皇后;(2)正负45‘方向不能再有皇后;
源代码如下:
/* 2015.5.21 by HanChun http://blog.csdn.net/code_7 */ public class Queen { private static int count = 0; //记录解的个数 public static void main(String[] args) { int[][] chessboard1 = new int[8][8]; //初始化棋盘 for(int i=0; i<8; i++){ for(int j=0; j<8; j++){ chessboard1[i][j] = 0; } } solveQue(0, 8, chessboard1); System.out.println("八皇后解的个数为:" + count); } public static int solveQue(int row, int col, int[][] chessboard){ int[][] chessboard2 = new int[8][8]; //复制chessboard留做后面递归使用 for(int i=0; i<8; i++){ for(int j=0; j<8; j++){ chessboard2[i][j] = chessboard[i][j]; } } if(row==8){ System.out.println("这是第" + (count+1) + "种解法"); for(int i=0; i<chessboard2.length; i++){ for(int j=0; j<chessboard2[i].length; j++ ){ System.out.print(chessboard[i][j] + " "); } System.out.println(); } count++; }else{ for(int j=0; j<col; j++){ if(!isPlaced(row, j, chessboard)){ for(int k=0; k<8; k++){ chessboard2[row][k] = 0; } chessboard2[row][j] = 1; solveQue(row+1, col, chessboard2); } } } return count; } public static boolean isPlaced(int row, int col, int[][] chessboard){ boolean flag1=false, flag2=false, flag3=false, flag4=false, flag5=false; //检查列是否有冲突 for(int i=0; i<8; i++){ if(chessboard[i][col] == 1){ flag1 = true; break; } } //检查左上是否有冲突 for(int i=row, j=col; i>=0 && j>=0; i--,j--){ if(chessboard[i][j] == 1){ flag2 = true; break; } } //检查右上是否冲突 for(int i=row, j=col; i>=0 && j<8; i--,j++ ){ if(chessboard[i][j] == 1){ flag3 = true; break; } } //检查右下是否有 for(int i=row, j=col; i<8 && j<8; i++,j++ ){ if(chessboard[i][j] == 1){ flag4 = true; break; } } //检查左下是否有冲突 for(int i=row, j=col; i<=0 && j>=0; i++,j-- ){ if(chessboard[i][j] == 1){ flag5 = true; break; } } if(flag1||flag2||flag3||flag4||flag5){ return true; } return false; } }
相关文章推荐
- "100 个台阶"问题的 4 种解法
- "struts中文问题","struts国际化问题"的终极解决方案[转载]
- Qt creator的"纯c/c++项目"输出中文乱码的问题
- "ora-00988 缺少或无效口令"问题的解决方法
- "Microsoft Office Word 遇到问题需要关闭"如何
- "... 无法下载Silverlight应用程序。请查看Web服务器设置." 问题的解决方法
- 修正问题 “警告:检测到时钟错误。您的创建可能是不完整的"
- "no symbol version for xxx"在2.6.26内核上的问题
- "Could not create java virtual machine"的问题解决
- "undefined reference to" 问题解决方法
- 如何解决用"adobe pdf"打印Djvu文件出现横线或横条的问题
- 'filename.h' file not found with <angled> include, use "quotes" instead. 问题详解
- "用户界面和多媒体"版面问题[二][j2medev][0406更新]
- 转】DB2导入导出使用"|"作分隔符的问题
- "explorer.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉"
- "红色病毒"问题
- "无法在web服务器上启动调试,不具备调试此程序的权限" 问题解决
- windows 7 如何关闭 程序崩溃时弹出的"windows正在检查该问题的解决方案"
- "struts中文问题","struts国际化问题"的终极解决方案
- "Caused by: java.lang.UnsatisfiedLinkError: Library hello-jni not found“问题解决