软件工程第三次作业

这个作业属于哪个课程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.变量的名字是否简单易懂之类的,请大佬们赐教(*^_^*)

修改之后,如下

 

 


 我感觉编程题就是先像数学题中找规律,然后根据规律编程,最后可以运用算法来优化

最后总结一下:

用java开发感觉if-else流程语句和一些基本语法没有大的问题,主要是一些常用的类(文件处理类,IO流)使用还不太熟练(因为Java自己中途有搁置一段时间,有些知识自己忘记了),导致开发效率低,中途遇到各种各样的bug,以至于气的连晚饭都不想吃了,但自己还是坚持做完了,bug也解决了。除此之外,就是这次的经历,上次的作业有点带糊弄的嫌疑,所以下午我就开始认真做作业,不再抱有侥幸的心理,认真对待每一次作业。以前自己觉得所有的作业一定要自己写,不要看其他人的。但是,但是,但是现在这个想法完全改变了。-----一定要去看别人的代码,从中进行学习,把别人的变成自己的,同样的思路,其他人实现的方法比自己优秀,那就学习他人的思路和实现方式,转换成自己的拿过来用(是的,白剽(⊙x⊙;),好 shameless (=•ェ•=))。现在开始打破墨守成规,网上那么多资源一定要去学习。这次的作业,我也从中学习了知识:回溯、Java cmd参数的接收、分治法和减治法.......好多好多(所以也可以看到我编程能力真的是弱爆了,但是可能会有人问我是不是选错了专业,前些天我还在犹豫,但是现在我的回答:没有。因为知识都是花时间学出来的,兴趣当然是一方面。可是我现在并不讨厌,反而慢慢开始有一点喜欢了)。扯了这么多,就是希望自己以后多动手,不会的就查,不要一直死磕。

原文地址:https://www.cnblogs.com/weiboshuosomnuslog/p/12208260.html