最近学习java开发,就编写第一个android程序 数独。
一、先了解一下数独规则:
-
9行9列,共81个小方格
-
每个小方格只能填1-9个数字
-
每一行数字不能重复,每一列数字不能重复,每一个小的九宫格也不能重复
二、设计思路:
1. 先生成一个完整的数独,并保存在一个二维数组中
2. 随机把n个小方格的值清空,二维数组对应小方格对应的值填0
3. 画图,绘制一个9行9列(共81个小方格),并根据二维数组绘制文本,0值绘制文本为空字符串
4. 选中小方格时,如果原始就有数字,则不做任何操作;否则改变被选中的小方格背景色,
可对该方格填写1-9个的任何个数字
6. 验证填写的数字,行、列、小九宫格是否重复;若不重复,绘制该文本,否则予以提示
三、设计步骤及关键代码
-
创建一个数独类 DrawShuduku,该类主要作用是生成数独且验证填写值是否正确
声明一个二维数组,9行9列
private final int ROWS=9; //九宫格行数 private final int COLS=9; //九宫格列数 private int[][] currentArray; private int[][] resultArray;
采用回溯方法,给每个小方格随机填写1-9(每一小方格都尝试填写),最终输出一个完整的数独二维数组,这个是本次的核心代码。
定义一个方法backTrackShuduku(int n),n从0开始,也就是第一行第一列(第一个小方格)
每个小方格都会尝试填写1-9的数字(随机填写),每个小方格都尝试9次(foreach循环),如果验证该数字不合法,则把该数字剔除,继续执行foreach下一个,
尝试填写其他数字,满足就填写该值 并 执行 backTrackShuduku(n+1),不满足就剔除该数字,以此类推填写后面的空格。
注意:不管所填写的数字是否合法,都需要把该foreach执行完。
n=81时,即所有空格都填满,则验证该数独合法性(数字是否有重复);如果是一个完整且合法的数独,则拷贝到另一个二维数组。
因为,此时,递归函数还没有执行完,会继续尝试填写其他数字,因为每一个小方格都会填写1-9共九次
/** * 采用回溯方法,给每个单元格尝试1-9填值 * @param n 目前需要填写的第n个单元格 */ private void backTrackShuduku(int n){ if(n==81){ //如果都已经填满,则校验填充的值是否都正确 for(int row=0;row<ROWS;row++){ for(int col=0;col<COLS;col++){ int value=currentArray[row][col]; if(value==0 || !isValid(row,col,value,currentArray)){ return;