zoukankan      html  css  js  c++  java
  • 软件工程实践2017第二次作业

    github地址

    解题思路:

    一开始拿到题目后就想到了八皇后问题,于是就在想想用熟悉的DFS把它先写出来。于是又想到怎么表示九宫格,是要用一个数用然后算式计算位置,还是直接用x,y表示坐标位置,在纸上计算了很久之后还是直接用x,y暴力表示比较简单(嘿嘿)。看到随机的要求后感觉要ran数,但是后面感觉会用时很长就没有用了,直接从一到九开始算。
    之后又再网上找了一点数独的解题思路后就开始准备写代码。遇到bug在解决。
    

    设计实现

    分为两个函数:DFS和输出函数,检查函数。还有一个主程序。
    

    代码说明

    int check(int x, int y, int m)          //检查是否重复的函数
    {
    	int x0, y0;
    	for (int i = 0; i <= 7; i++)
    	{
    		if (Data[x][(y + i) % 9 + 1] == m)        //检查行
    		{
    			return false;
    		}
    		if (Data[(x + i) % 9 + 1][y] == m)       // 检查列
    		{
    			return false;
    		}
    	}
    
    	if ((double)x / 3 <= 1)  x0 = 0;
    	if ((double)x / 3 >1 && (double)x / 3 <= 2) x0 = 1;
    	if ((double)x / 3 >2 && (double)x / 3 <= 3) x0 = 2;
    	if ((double)y / 3 <= 1) y0 = 0;
    	if ((double)y / 3 >1 && (double)y / 3 <= 2) y0 = 1;
    	if ((double)y / 3 >2 && (double)y / 3 <= 3) y0 = 2;
    	for (int i = 1; i <= 3; i++)
    	{
    		for (int j = 1; j <= 3; j++)
    		{
    			if (Data[(x0 * 3) + i][(y0 * 3) + j] == m)        //检查小九宫格
    				return false;
    		}
    	}
    	return true;
    }
    
    void dfs(int x, int y, int n)
    {
    	if (Count >= n)
    	{
    		return;
    	}
    	if (x>9)                                                    //当行超过9行后输出
    	{
    		for (int i = 1; i <= 9; i++)
    		{
    			for (int j = 1; j <= 9; j++)
    			{
    				myfile << Data[i][j] << " ";
    				//cout << Data[i][j] << " ";
    			}
    			myfile << endl;
    		}
    		myfile << endl;
    		Count++;
    		return;
    	}
    	for (int i = 1; i <= 9; i++)
    	{
    		if (check(x, y, i))
    		{
    			Data[x][y] = i;
    			if (y >= 9) dfs(x + 1, 1, n);
    			else dfs(x, y + 1, n);
    		}
    		if (y >= 9) Data[x + 1][1] = 0;
    		else Data[x][y + 1] = 0;                //令下个格子的数为零。
    	}
    }
    
    
        其中的检查函数中的难点对于我来说是要检查搜索小九宫格的数的位置。用了好几种方法在计算总感觉不是很满意。最后只能选择一种比较蠢的方法,将八十一格分成一到九的九个九宫格,然后用x,y计算出在第几个九宫格后遍历。
    

    测试运行

    性能分析

    当N=1000000时的性能分析图:
    

    PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
    Planning 计划 40 35
    · Estimate · 估计这个任务需要多少时间 600 450
    Development 开发 600 450
    · Analysis · 需求分析 (包括学习新技术) 100 260
    · Design Spec · 生成设计文档 20 30
    · Design Review · 设计复审 (和同事审核设计文档) 10 25
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范)
    · Design · 具体设计 60 80
    · Coding · 具体编码 100 150
    · Code Review · 代码复审 60 55
    · Test · 测试(自我测试,修改代码,提交修改) 60 110
    Reporting 报告 60 60
    · Test Report · 测试报告 30 45
    · Size Measurement · 计算工作量 30 25
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 30
    合计 600 790
  • 相关阅读:
    Hadoop启动报Error: JAVA_HOME is not set and could not be found
    mrjob在hadoop上跑的时候,报错
    Hadoop3安装踩坑 there is no HDFS_NAMENODE_USER defined. Aborting operation.
    mrjob 运行报错
    站位

    Lua基本数据类型
    常量指针和指针常量
    C基础题
    C++拷贝构造函数(深拷贝,浅拷贝)
  • 原文地址:https://www.cnblogs.com/Flame09/p/7502476.html
Copyright © 2011-2022 走看看