JAVA学习笔记(2):求解和为15的棋盘游戏
来源:互联网 发布:seo超级管家 编辑:程序博客网 时间:2024/06/09 21:42
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.代码部分
/************************问题描述:把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|
+—–+
- JAVA学习笔记(2):求解和为15的棋盘游戏
- 求解和为15的棋盘游戏问题的代码分析
- 和为15的棋盘游戏
- 最早的棋盘游戏
- Sparse Filtering 学习笔记(三)目标函数的建立和求解
- 深度学习笔记(五) 代价函数的梯度求解过程和方法
- 棋盘游戏(三子棋)
- Java 4X4棋盘游戏
- Java的GUI学习:显示国际棋盘
- LDA主题模型学习笔记2:求解隐变量和模型参数(EM思想)
- 【Java学习笔记】40:棋盘覆盖问题的可视化(基于JFrame)
- android游戏编程的学习笔记(以植物大战僵尸等游戏源代码解析为例)
- 【Java学习笔记】42:改进JFrame可视化棋盘覆盖
- 棋盘游戏(二分图)
- 棋盘游戏(匈牙利算法)
- 【例子】一个小益智游戏(过河游戏)的求解
- 棋盘游戏 (二分图的最大匹配)
- Algorithm学习笔记 --- Fibonacci(递归求解)
- Context的理解
- javascript之数据类型与变量
- ActiveMQ发布订阅模式
- Sicily 最大和 | 期末算法机考模拟题
- set的重载.
- JAVA学习笔记(2):求解和为15的棋盘游戏
- 查找算法
- 游戏编程入门(20):记录高分
- 解决idea自动生成的web.xml中web-app报错的问题
- X2Go Client的使用(新手向)
- 高空坠球
- 论文笔记:ImageNet classification with deep convolution neural networks
- matlab结果保存为txt
- F