当前位置: 首页 > news >正文

软件工程实践2017第二次作业

Github:sudoku

项目相关要求

利用程序随机构造出N个已解答的数独棋盘 。

输入

数独棋盘题目个数N(N在0和1000000之间)

输出

随机生成N个不重复的已解答完毕的数独棋盘,并输出到sudoku.txt中。在生成数独矩阵时,左上角的第一个数为:(学号后两位相加)% 9 + 1。

思路与代码

一暑假没碰过代码的我,在暑假结束前一周看到了这个作业题目,脑子里想起来的就是大一的时候敲得八皇后和马遍历的题目,比较类似,都是关于递归回溯的算法。大致思路就是给每个格子试不同的数,找到符合条件的填下,如果不可以的就回到前一个,换一个数再试试,不行再回溯,于是有了下面的代码:

int count=0;//统计输出了多少数独 
void sudoku(int i,int j)
{
    for(int x=1;x<=9;x++)//给每个格子都试9个数 
    {
        if(check(i,j,x)==1)//如果可以 
        {
            board[i][j]=x;//就赋值 
            if(i==8&&j==8)//如果填满了,就输出 
            {
                print();
                count++;
                if(count>=N) exit(-1);
                return;//输出还没到N个,就继续返回试其他数 
            }
            if(j==8)//如果当前位置是某一行最后一个,就跳到下一行第一个 
            {
                sudoku(i+1,0);
            }
            else//不然就跳到下一个 
            {
                sudoku(i,j+1);
            }
        }
    }
    board[i][j]=0;
    return ;//这个格子没有一个数符合,就返回上一个格子 
} 

下面是判断这个格子是否可以这个数的check函数:

int check(int row,int col,int num)//判断是否能放 
{
    for(int i=0;i<9;i++)//判断列有没相同的 
    {
        if(board[i][col]==num)return 0;
    }
    for(int j=0;j<9;j++)//判断行有没相同的 
    {
        if(board[row][j]==num)return 0;
    }
    int x=row/3,y=col/3;
    x=3*x;
    y=3*y;
    for(int i=0;i<3;i++)//检查小九宫格 
    {
        for(int j=0;j<3;j++)
        {
            if(board[x+i][y+j]==num)return 0;
        }
    }
    return 1;
}

生成100W个数独大概要52秒左右
生成的结果输出到sudoku.txt
1226734-20170910210057632-1256081157.png

性能分析

用VS自带的性能分析器进行分析,测试的生成的数独为10W个:
1226734-20170910210107491-751743213.png
1226734-20170910210117319-859309981.png
1226734-20170910210122476-329914782.png

PSP

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划
· Estimate· 估计这个任务需要多少时间8001000
Development开发
· Analysis· 需求分析 (包括学习新技术)120130
· Design Spec· 生成设计文档00
· Design Review· 设计复审 (和同事审核设计文档)00
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)6060
· Design· 具体设计90120
· Coding· 具体编码270330
· Code Review· 代码复审6060
· Test· 测试(自我测试,修改代码,提交修改)9090
Reporting报告
· Test Report· 测试报告120110
· Size Measurement· 计算工作量3030
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划6060
合计9001050

反思与总结

这次代码虽然思路简单,但是递归实现起来理解的意思确实很复杂,因为好久没敲这类题,已经忘记了当时如何理解递归。经过一番痛苦挣扎(把之前八皇后和马遍历的代码翻出来温习了一下),总算有点想明白,递归就是层层递归,就像一颗树一样,从根节点递归到子节点,子节点行不通,return会根节点从旁路走。其实我还想了一种方法(其实是网上看到的),就是把九宫格分成九个独立的宫,因为每个宫都会有1-9九个数字,所以就按数字来放,比如先把1排进每个宫,接着放2,以此类推,而且在放头尾两个数的时候完全不用回溯,我觉得应该会减少代码运行复杂度,我也尝试的敲了下,奈何学艺不精没有成功,于是就选了这种普通的方法。这很反映了我现在的代码能力很弱,需要加强咯。

转载于:https://www.cnblogs.com/n9705/p/7502277.html

相关文章:

  • python django步骤_python - django (创建到运行流程)
  • CODEVS——T 1004 四子连棋
  • linux查看显卡信息_如何查看linux系统的相关信息
  • 华宇笔试题总结
  • system.objectdisposedexception: 已释放该集合_集合啦!动物森友会夏季更新第 2 弹!烟火大会、梦境参观、复原储存资料即将来袭...
  • JS中innerHTML、outerHTML、innerText 、outerText、value的区别与联系?jQuery中的text()、html()和val() ?...
  • python 逗号作用 语句间_python逗号作用
  • SDUT_2116 数据结构实验之链表一:顺序建立链表
  • 华三模拟器hcl实验手册_Caffeinated 6.828:实验 1:PC 的引导过程
  • WEB API 版本控制
  • 阿里云轻量服务器 外网卡_腾讯云轻量应用服务器(免费内测)开箱测评
  • mixbox工具箱_让小米路由回归智能,3款第三方工具箱以及插件评测
  • mysql 学习笔记
  • 华为杯数学建模优秀论文_数学建模经典例题(2006年国赛A题与优秀论文)
  • 信息验证 正则表达式
  • CSS 专业技巧
  • HTML中设置input等文本框为不可操作
  • JavaWeb(学习笔记二)
  • linux安装openssl、swoole等扩展的具体步骤
  • MQ框架的比较
  • vue自定义指令实现v-tap插件
  • 诡异!React stopPropagation失灵
  • 机器学习 vs. 深度学习
  • 前端面试总结(at, md)
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 入门级的git使用指北
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 湖北分布式智能数据采集方法有哪些?
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • (145)光线追踪距离场柔和阴影
  • (阿里云万网)-域名注册购买实名流程
  • (补)B+树一些思想
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (强烈推荐)移动端音视频从零到上手(下)
  • (十一)手动添加用户和文件的特殊权限
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET 设计一套高性能的弱事件机制
  • @EnableWebMvc介绍和使用详细demo
  • @hook扩展分析
  • @html.ActionLink的几种参数格式
  • [BUUCTF 2018]Online Tool
  • [bzoj2957]楼房重建
  • [C++][基础]1_变量、常量和基本类型
  • [C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!
  • [Django 0-1] Core.Checks 模块
  • [Django 0-1] Core.Handlers 模块
  • [Git 1]基本操作与协同开发
  • [hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 将mysq数据导入HBASE
  • [LeetCode][LCR190]加密运算——全加器的实现
  • [Linux]知识整理(持续更新)
  • [LLM]大模型八股知识点(一)