如何基于java语言实现八皇后问题
2019-12-15 12:08
1226 查看
这篇文章主要介绍了如何基于java语言实现八皇后问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
八皇后问题,在一个8X8的棋盘中,放置八个棋子,每个棋子的上下左右,左上左下,右上右下方向上不得有其他棋子。正确答案为92中,接下来用java语言实现。
代码如下
package eightQuen; /** * 八皇后问题 * * @author 83771 * */ public class eight { // 定义一个数组 表示棋盘 public static Integer[][] checkerBoard = new Integer[8][8]; // 棋盘副本 public static Integer[][] checkerBoardCopy = new Integer[8][8]; // 计数器 用于计数有多少种方法 public static Integer jishu = 1; // 定义横竖斜方向上是否有棋子 public static boolean flag1 = true; public static boolean flag2 = true; public static boolean flag3 = true; public static boolean flag4 = true; // 初始化一个棋盘 8x8 public static void init() { for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { System.out.print(0 + " "); checkerBoard[i][j] = 0; } System.out.println(); } checkerBoardCopy = checkerBoard; } // 递归测试方法 public static void startTest(int row) { for (int col = 0; col < 8; col++) { if (checkCheet(row, col, checkerBoardCopy) == 1) { if (row < 7) { startTest(++row); --row; } } // 该行重新赋值为0 进行下一次判断 checkerBoardCopy[row][col] = 0; } } // 检查是否危险 // row行 // col列 public static int checkCheet(int row, int col, Integer[][] checkerBoardCopy) { flag1 = true; flag2 = true; flag3 = true; flag4 = true; // 行方向上是否满足条件 for (int i = 0; i < 8; i++) { if (checkerBoardCopy[row][i] == 1) { flag1 = false; break; } } // 列方向上是否满足条件 for (int j = 0; j < 8; j++) { if (checkerBoardCopy[j][col] == 1) { flag2 = false; break; } } // 右下方向 for (int i = row, j = col; i < 8 & j < 8; i++, j++) { if (checkerBoardCopy[i][j] == 1) { flag3 = false; break; } } // 左上方向 for (int i = row, j = col; i >= 0 & j >= 0; i--, j--) { if (checkerBoardCopy[i][j] == 1) { flag3 = false; break; } } // 左下方向 for (int i = row, j = col; i < 8 & j >= 0; i++, j--) { if (checkerBoardCopy[i][j] == 1) { flag4 = false; break; } } // 右上方向 for (int i = row, j = col; i >= 0 & j < 8; i--, j++) { if (checkerBoardCopy[i][j] == 1) { flag4 = false; break; } } if (flag1 & flag2 & flag3 & flag4) { // 若为真 增此点的值赋为1 checkerBoardCopy[row][col] = 1; // 如果已经判断到最后一行 并且最后一行也符合情况 打印整个棋盘 if (row == 7) { printCheets(checkerBoardCopy); } return 1; } return 0; } // 打印棋盘方法 public static void printCheets(Integer[][] checkerBoardCopy) { for (int i = 0; i < 8; i++) { for (int j = 0; j < 8; j++) { System.out.print(checkerBoardCopy[i][j] + " "); } System.out.println(); } System.out.println("=================" + jishu++); } public static void main(String[] args) { init(); startTest(0); } }
copy后可直接运行。 记一下这次的代码。
以上就是本文的全部内容,希望对大家的学习有所帮助
您可能感兴趣的文章:
相关文章推荐
- 在ASP.NET中如何用C#.NET实现基于表单的验证
- 如何实现基于Jazz Team Server的RQM与LDAP的集成(二)
- 如何使用EnumSet实现基于bit field的enum set?
- 教你如何使用Java手写一个基于数组实现的队列
- 如何实现基于AD的MOSS的FORM认证方式
- 如何基于cocos2dx3.x实现A星寻路算法
- 教你如何实现华为,小米,魅族等定制等系统应用间的跳转,权限管理,自启动管理等与定制rom交互(也是基于反编译研究成果有感怕忘记下来)
- 如何使用 C# .NET 在 ASP.NET 应用程序中实现基于窗体的身份验证
- 如何基于RabbitMQ实现优先级队列
- 如何实现基于内容和用户画像的个性化推荐
- 基于MonoRail 的Web程序如何实现更换模板
- 如何基于Agora Web SDK实现小程序互动连麦
- 基于S5PV210开发板wince环境下如何调通wifi,实现其上网功能?
- vue项目如何实现国际化?分享一下基于vue-i18n实现国际化的经验
- 如何设计数据库表实现完整的RBAC(基于角色权限控制)
- 基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
- 如何实现基于框架的书籍交易网站的质量属性
- 基于 wke 的浏览器:如何实现 js 和 c++ 的互相调用
- 基于mAppWidget实现手绘地图(十五)–如何控制放大缩小
- 如何实现基于tcp进行http交互