个人项目:数独

 1.GitHub地址:https://github.com/meiminmin/shuduku

 

2.PSP表格

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划3030
Estimate估计这个任务需要多少时间3030
Development开发900900
Analysis需求分析(包括学习新技术)120120
Design Spec生成设计文档120120
Design Review设计复审3030
Coding Standard代码规范3030
Design具体设计240240
Coding具体编码600600
Code Review代码复审3030
Test测试3030
Reporting报告9090
Test Report测试报告3030
Size Measurement计算工作量1515

Postmortem&Process Improvement Plan

事后总结并提出过程改进计划4545
 合计23402340

 

3. 解题思路描述:该项目的难点在于:文件的读取和输出,命令行,生成不重复终局,解数独四个部分。

    (1):文件的读取和输出:在这个项目之前还没接触过文件的读取和输出。所以问了很多大佬以及百度很多资料后终于学会了文件的读取和输出。注意一点:exe要和文件保存在同一个目录下。

    (2): 命令行:需要注意的是:int main(int argc, char * argv[]),在cmd输入的时候要判断是c还是s。如果是c要完成的任务是生成c个数独;如果是s要完成的任务是解数独。

    (3):生成不重复数独终局:学号尾号24%9+1=7,所以左上角的第一个数是7。于是先写了一个数独终局:

       7 8 9 1 2 3 4 5 6

       1 2 3 4 5 6 7 8 9

       4 5 6 7 8 9 1 2 3

 

       8 9 1 2 3 4 5 6 7

       2 3 4 5 6 7 8 9 1

       5 6 7 8 9 1 2 3 4

  

       9 1 2 3 4 5 6 7 8

       3 4 5 6 7 8 9 1 2

       6 7 8 9 1 2 3 4 5

     后8行都可以看做根据第一行左移得到,第一行全排列有8!=40320种,然后交换2-3(因为数据只要求1e6,可以不 考虑),4-6,7-9行,再乘3!×3!,结果略大于1e6。

   (4)解数独:主要思路是用dfs暴力搜索完成。

 

4.设计实现过程:

  (1)代码结构:

        

     (2)关键函数:

             <1>.解数独:int jsd(int arr[9][9], int row, int col) :不断判定行、列、所在小九宫格是否重复。

             <2>.生成数独终局:void generate1to9() :产生9个随机数。数独左上角第一个数是24%9+1=7

                                             void generator():生成不重复的数独终局。

    (3)单元测试:

             命令行参数判定:-c,  -s,  -abc

     运行情况判定:-c 1,  -c 10000,  -c  1000000,  -s 文件路径(其中包含1、10000、1000000个用例)

   (4)运行分析:从图中可知,打开文件和保存文件占据的时间最多。

           (1)生成1000个数独终局:

            

          

        (2)解1000个20-40个空格的数独

            

 

           

5. 代码说明:

        if(argc>1) :当输入的argc>1时才可以运行代码。(这是个坑点,坑了我好久,一直不知道哪里出错了。)

        if(argv[1][1]=='s')  当输入s时,要解数独。

        else if(argv[1][1]=='c') 当输入是c时,要生成c个数独,并且保存。

        for (e = 0; e < 9;e++)

    {  
          for (f = 0; f < 9; f++)

          {  
             fputc(num[e][f]+'0',fp3);
             if(f!=8)  fputc(' ',fp3);
            }
             fputc('\n',fp3);
    }   // 文件的保存

 

       

        

 

转载于:https://www.cnblogs.com/mmm3/p/8901980.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值