zoukankan      html  css  js  c++  java
  • sudoku--SE第二次作业

    git传送门


    编译环境:

    windows10、vs2017

    所用语言:

    c++

    首先作为一个晚上闭眼的玩家,我先来讲一下我的心路历程:

           最开始接到作业的时候心里是拒绝的,刚出了一趟小远门就这样,就很难受,等回到家马不停蹄得开始写数独。前期想了挺久的,没什么头绪,挺着急的,后来在《编程之美》上看到了一种解法,觉得挺新奇的,根据题目要求,我把他改成了自己的一种思路(思路链接)。在手动验证可行性后呢,就开始编写代码了。
           因为这种思路实现起来挺简单的,编写过程中出错不多也迅速解决了,就不多赘述了,其中主要的函数为两个交换函数(行交换、列交换)
    //行交换
    void HS(int a, int b, int c, int d)
    {
    	for (int j = 0; j < 3; j++)
    	{
    		sudoku[c][d + j] = sudoku[a + 1][b + j];
    		sudoku[c + 1][d + j] = sudoku[a + 2][b + j];
    		sudoku[c + 2][d + j] = sudoku[a][b + j];
    	}
    }
    
    //列交换函数
    void LS(int a, int b, int c, int d)
    {
    	for (int j = 0; j < 3; j++)
       	{
    		sudoku[c + j][d] = sudoku[a + j][b + 2];
    		sudoku[c + j][d + 1] = sudoku[a + j][b];
    		sudoku[c + j][d + 2] = sudoku[a + j][b + 1];
    	}
    }
    
           我的思路中是完成了左上角第一个九宫格的随机生成,尔后去经过行列变换生成其余的九宫格。两个函数中的参数a、b、c、d为坐标,即原始九宫格的左上角坐标(a,b),目标九宫格的左上角坐标(c,d),通过两个坐标完成九宫格的搭建。

    这个时候问题来了

           理论上随机一个九宫格内的数,且左上角的数字固定的情形下,生成的数独情况只有8!种,也就是40320种,离题目要求的数还有很大的差距,该如何解决?
           因为思路中数独除去左上角的第一个九宫格是随机生成的,而其他的则是由其变化而来,而变化的顺序不影响其准确性,如下
    B1 B2 B3
    B4 B5 B6
    B7 B8 B9
    B2由B1行变化得来,B3由B2行变换得来是可行的,或者B3又B1行变换得来,B2由B3行变换得来也是允许的。B4、B7同。故而,B2、B3、B4、B7的变换便有4种不同的形式。再接着,B5、B6、B8、B9可以由B2、B3列变换得到,也可由B4、B7换变换得来,变换顺序也有4种,故而多出8种。一共就有了8440320=1290240种,理论上突破了一百万的大关。

    以下是运行结果

    结果图1

    结果图2

    单元测试

           到现在也只写出了简单的单元测试,就很难受,而且按照教程出不来覆盖率,难受成200斤的胖子。

    性能分析




    PSP

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 60 120
    · Estimate · 估计这个任务需要多少时间 1440 2880
    Development 开发 120 120
    · Analysis · 需求分析 (包括学习新技术)
    · Design Spec · 生成设计文档
    · Design Review · 设计复审 (和同事审核设计文档)
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范)
    · Design · 具体设计 120 120
    · Coding · 具体编码 120 60
    · Code Review · 代码复审
    · Test · 测试(自我测试,修改代码,提交修改) 1440 无穷
    Reporting 报告
    · Test Report · 测试报告
    · Size Measurement · 计算工作量 10 10
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 60
    合计 1900 无穷
    没有计时就粗略估计一下了,改代码真的会崩溃。

    收获

    本次的学习,收获了以下
    • 认识了以前重来没有用过的单元测试等功能,感觉自己又朝着低级程序员迈进了一步。
    • deadline才是第一生产力
    • git还是一如既往的容易出错(小白的心声)
    • 我短暂的玩耍时光没了,很难受
    • 感觉这次的作业和以往的编程有很大的区别,除了难度上,让人感觉更加的像是一个“小小小项目”,而不单单是打代码。
    • 最后收获了又一次的心态崩溃

    针对执行力 、 泛泛而谈 的理解:

           执行力百度百科给出的解释是

    执行力是指有效利用资源、保质保量达成目标的能力,指的是贯彻战略意图,完成预定目标的操作能力。是把企业战略、规划、目标转化成为效益、成果的关键。

    对我理解而言,即是利用好我们手头能收集到的资料、优质老师资源等,保质保量得完成我们的任务,为执行力。而泛泛而谈,是我们这几年养成的一个坏习惯,所有事在说不清楚的情况下就喜欢用一些很空的词带过去,这点很坏无疑。为了改成这点,我会努力在接下来的时间内逐渐的将这些词改掉,拿出实际的数据来,希望大家指教。

    第二次更新

    之前跑100万的数据要几分钟,后来将vs里面的debug改成release后,只需要30秒左右就可以了

    ---------------------------------------持续更新(09.10)-----------------------------------------------

  • 相关阅读:
    C 语言定义
    一次系统磁盘异常使用100%的处理
    supervisord 安装、配置体验
    uva 211(dfs)
    poj1651
    有一种感动叫ACM(记WJMZBMR在成都赛区开幕式上的讲话)
    nyoj-746
    Codeforces Round #308 (Div. 2)----C. Vanya and Scales
    long long 与 _int64
    石子归并问题(nyoj737)
  • 原文地址:https://www.cnblogs.com/SwordX/p/7500864.html
Copyright © 2011-2022 走看看