这个作业属于哪个课程 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1 |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/zswxy/software-engineering-2017-1/homework/10494 |
这个作业的目标 | 编写程序实现数独填充 |
作业正文 | 如下所示 |
其他参考文献 | www.baidu.com |
Github项目地址:https://github.com/somnusw/sodocu/blob/master/Sudoku.java
根据这个要求写一个方法outside,以判断在九宫格中的坐标(x,y)的位置上插入value,是否符合上述规则,这个想法自己想了好久,不断地尝试和改进
(✿◕‿◕✿)代码如下
写完上面的代码之后,也要考虑到一些特殊的宫格,理解完题意之后,觉得对4、6、8、9宫格的求解应该就是算法中的分治法----分而治之
四宫格:盘面是2*2四个宫,每一宫又分为2*2四个小格。使1-4每个数字在每一行、每一列和每一宫中都只出现一次;---------转换成2*2的常规宫格来进行outside
六宫格:盘面是2*3六个宫,每一宫又分为3*2六个小格。使1-6每个数字在每一行、每一列和每一宫中都只出现一次;---------转换成3*2的常规宫格来进行outside
八宫格:盘面是4*2八个宫,每一宫又分为2*4八个小格。使1-8每个数字在每一行、每一列和每一宫中都只出现一次;---------转换成2*4的常规宫格来进行outside
九宫格:盘面是3*3九个宫,每一宫又分为3*3九个小格。使1-9每个数字在每一行、每一列和每一宫中都只出现一次;---------转换成3*3的常规宫格来进行outside
o(* ̄▽ ̄*)o,如果有不对的地方希望大佬们帮忙改进
//下面是判断矩阵是否特殊的4、6、8、9宫格的求解方法
.
。。。。。。。。。
优化思路:
outside方法写完之后,并没有结束,求解九宫格的核心思想让我为之思考了好长时间,首先想到的是按照玩数独的思维来解答:也就是自己常用的排除法,先将每行每列每个宫里面不可能出现的数字排除掉,然后将一些确定的数字填上去,然后再排除,再填......显然这种方法太笨了,暴力破解,并且时间太了。于是去询问大佬,提示了我一下,让我使用回溯法,马上有了思路(跟上会迷宫的回溯几乎是一样的),于是就将暴力破解优化为回溯求解(●ˇ∀ˇ●)。不过在确定x、y的值时,出现了一些问题,就去百度了一下。
具体代码和注释如下:
使用回溯法求解数独
由于之前没有在cmd上执行过Java输入参数的程序,(是的,就像你看到的这样,我很菜,但是后续我也会慢慢吸收的)所以就查了一下,自己写个别的程序试着运行一下,然后转过头来用得到这个程序里面
初始化命令行的传入的参数
最后就是主函数
遇到的问题(这个问题耽误了我3个小时左右):
在cmd中输入命令的时候,要么报找不到该主类
要么就是为无效标记
要么就是没有任何报错就是无法执行文件
最后在我不懈的努力下终于找到了错误,并且如愿解决(●ˇ∀ˇ●)
java +文件名+.java
异常处理:主要是对文件的读取进行异常处理
写完代码运行成功之后进行静待检查,出现好多不规范的提示
1.没有添加创建者的信息
2.类、类属性、类方法注释不规范,应该用/**。。。。*/
3.使用了未经定义的常量
4.自己的注释是否太过繁琐,还请大佬们教我o(* ̄▽ ̄*)o
5.变量的名字是否简单易懂之类的,请大佬们赐教(*^_^*)
修改之后,如下
我感觉编程题就是先像数学题中找规律,然后根据规律编程,最后可以运用算法来优化