JAVA学习笔记(2):求解和为15的棋盘游戏
2017-07-06 21:27
603 查看
1.问题描述
把1,2,3,4,5,6,7,8,9这九个数字填入3*3的九宫格中,要求实现每行,每列和每个对角线上的数字之和为15。
2.解决思路
2.1 画出九宫格
设计方法mb_outputGridRowBoard画出九宫格,思路大致为
先输出:+—–+
再输出:|数字|数字|数字|
通过输出三次可以形成如下所示的输出图案:
+ - - - - - +
|数字|数字|数字|
+ - - - - - +
|数字|数字|数字|
+ - - - - - +
|数字|数字|数字|
2.2 对填入九宫格中的数据进行判断
设计方法mb_checkAll(),这个方法中又调用 mb_checkRow(),mb_checkCow( ),mb_checkDiag()分别用于判断每行,每列和每个对角线上的数字之和是否为15,如果都是,则返回true,如果不是则返回false。
2.3 如何实现填入九宫格的数据满足要求
在这里我主要通过对数列{1,2,3,4,5,6,7,8,9}求全排列,每一次的排列我将其填入九宫格中,通过方法mb_fullPermutation()实现,这是一个全排列的递归函数。其中交换的部分,由于java中不存在指针的功能,所以在数据交换上面,我把数列设置为了静态变量,这样实现交换。
3.代码部分
4.结果
第1种情况:
+—–+
|2|7|6|
+—–+
|9|5|1|
+—–+
|4|3|8|
+—–+
第2种情况:
+—–+
|2|9|4|
+—–+
|7|5|3|
+—–+
|6|1|8|
+—–+
第3种情况:
+—–+
|4|3|8|
+—–+
|9|5|1|
+—–+
|2|7|6|
+—–+
第4种情况:
+—–+
|4|9|2|
+—–+
|3|5|7|
+—–+
|8|1|6|
+—–+
第5种情况:
+—–+
|6|1|8|
+—–+
|7|5|3|
+—–+
|2|9|4|
+—–+
第6种情况:
+—–+
|6|7|2|
+—–+
|1|5|9|
+—–+
|8|3|4|
+—–+
第7种情况:
+—–+
|8|3|4|
+—–+
|1|5|9|
+—–+
|6|7|2|
+—–+
第8种情况:
+—–+
|8|1|6|
+—–+
|3|5|7|
+—–+
|4|9|2|
+—–+
把1,2,3,4,5,6,7,8,9这九个数字填入3*3的九宫格中,要求实现每行,每列和每个对角线上的数字之和为15。
2.解决思路
2.1 画出九宫格
设计方法mb_outputGridRowBoard画出九宫格,思路大致为
先输出:+—–+
再输出:|数字|数字|数字|
通过输出三次可以形成如下所示的输出图案:
+ - - - - - +
|数字|数字|数字|
+ - - - - - +
|数字|数字|数字|
+ - - - - - +
|数字|数字|数字|
2.2 对填入九宫格中的数据进行判断
设计方法mb_checkAll(),这个方法中又调用 mb_checkRow(),mb_checkCow( ),mb_checkDiag()分别用于判断每行,每列和每个对角线上的数字之和是否为15,如果都是,则返回true,如果不是则返回false。
2.3 如何实现填入九宫格的数据满足要求
在这里我主要通过对数列{1,2,3,4,5,6,7,8,9}求全排列,每一次的排列我将其填入九宫格中,通过方法mb_fullPermutation()实现,这是一个全排列的递归函数。其中交换的部分,由于java中不存在指针的功能,所以在数据交换上面,我把数列设置为了静态变量,这样实现交换。
3.代码部分
/************************ 问题描述: 把1-9填入3*3的棋盘中,保证各行, 各列,对角线上的数字之和为15! *************************/ public class J_Grid15 { int [] [] m_board; static int source [] = {1,2,3,4,5,6,7,8,9}; static int count = 1; J_Grid15() { m_board = new int [3] [3]; } //输出棋盘的格线行 private void mb_outputGridRowBoard() { int i; System.out.print("+"); for(i = 0;i < 5;i++) { System.out.print("-"); } System.out.println("+"); } //输出棋盘的数据行(第i行,i = 0 1 2) private void mb_outputGridRowBoard(int i) { int j; for(j = 0;j < m_board[i].length;j++) { System.out.print("|"+m_board[i][j]); } System.out.println("|"); } //输出棋盘 public void mb_outputGrid() { int i; mb_outputGridRowBoard(); for(i = 0;i < m_board.length;i++) { mb_outputGridRowBoard(i); mb_outputGridRowBoard(); } } //初始化数据 private void mb_dataInit() { int i,j,k = 1; for(i = 0;i < 3;i++) for(j = 0;j < 3;j++) m_board[i][j] = k++; } //检查行和是否满足15 private boolean mb_checkRow() { for(int i = 0;i < 3;i++) { if(m_board[i][0]+m_board[i][1]+m_board[i][2] != 15) return false; } return true; } //检查列和是否满足15 private boolean mb_checkCow() { for(int i = 0;i < 3;i++) { if(m_board[0][i]+m_board[1][i]+m_board[2][i] != 15) return false; } return true; } //检查对角线和是否满足15 private boolean mb_checkDiag() { if(m_board[0][0] + m_board[1][1] + m_board[2][2] != 15) return false; if(m_board[0][2] + m_board[1][1] + m_board[2][0] != 15) return false; return true; } //检查行、列与对角线之和是否满足15 private boolean mb_checkAll() { if(!mb_checkRow()) return false; if(!mb_checkCow()) return false; if(!mb_checkDiag()) return false; return true; } //数据交换 private void mb_Swap(int lhs, int rhs) { int t = source[lhs]; source[lhs] = source[rhs]; source[rhs] = t; } //数据求解并输出,原理:对数列进行全排列填入九宫格中进行判断 private void mb_fullPermutation(int source[],int begin,int end) { int i = 0,k = 0; if(begin >= end) //找到一个全排列 { for(int j = 0;j < 3;j++) { m_board[j][0] = source[k+0]; m_board[j][1] = source[k+1]; m_board[j][2] = source[k+2]; k = k + 3; } if(mb_checkAll()) { System.out.println("第" + count + "种情况:"); count++; mb_outputGrid(); } } else { for(i = begin;i < end;i++) { if(begin != i) { mb_Swap(begin, i); } // 递归排列剩余的从begin+1到end的元素 mb_fullPermutation(source, begin + 1, end); if (begin != i) { mb_Swap(begin, i); // 回溯时还原 } } } } public static void main(String[] args) { J_Grid15 a = new J_Grid15(); a.mb_fullPermutation(source,0,9); System.exit(0); } }
4.结果
第1种情况:
+—–+
|2|7|6|
+—–+
|9|5|1|
+—–+
|4|3|8|
+—–+
第2种情况:
+—–+
|2|9|4|
+—–+
|7|5|3|
+—–+
|6|1|8|
+—–+
第3种情况:
+—–+
|4|3|8|
+—–+
|9|5|1|
+—–+
|2|7|6|
+—–+
第4种情况:
+—–+
|4|9|2|
+—–+
|3|5|7|
+—–+
|8|1|6|
+—–+
第5种情况:
+—–+
|6|1|8|
+—–+
|7|5|3|
+—–+
|2|9|4|
+—–+
第6种情况:
+—–+
|6|7|2|
+—–+
|1|5|9|
+—–+
|8|3|4|
+—–+
第7种情况:
+—–+
|8|3|4|
+—–+
|1|5|9|
+—–+
|6|7|2|
+—–+
第8种情况:
+—–+
|8|1|6|
+—–+
|3|5|7|
+—–+
|4|9|2|
+—–+
相关文章推荐
- 传智博客学习笔记15--JAVA网络编程
- java 设计模式 学习笔记(15) 组合模式
- 毕向东的Java学习笔记Day 15
- Java学习笔记 ——15
- 15. JAVA 反射机制 Part 2(动态代理、类的生命周期、工厂设计模式) ----- 学习笔记
- 09 12 15 JavaWeb 学习笔记
- java学习笔记15——不可变类
- Java学习笔记(一)用Eclipse把一个简单游戏项目生成可执行的JAR文件
- 黑马程序员—15—java基础:有关泛型的学习笔记和学习心得体会
- java界面编程学习笔记:打地鼠游戏
- Java学习笔记---15.面向对象编程10-Java中final关键字,抽象类与接口
- 【Java学习笔记】基础知识学习15【文本输入】
- Java 学习笔记15:关于web开发中,全局变量的一点想法
- [学习笔记]小型java游戏引擎_1
- Java学习笔记15
- 学习笔记15—Java高新技术3
- java学习笔记15--引用传递
- java学习笔记15--引用传递
- java学习笔记15
- Java并发学习笔记(15)信号量(Semaphore) 关卡((2)CyclicBarrier)