软件工程实践2019第三次作业

一、GitHub项目地址

https://github.com/noapanda/031702603


二、PSP表

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 20 20
Estimate 估计这个任务需要多少时间 900 1440
Development 开发 180 200
Analysis 需求分析 (包括学习新技术) 100 200
Design Spec 生成设计文档 30 60
Design Review 设计复审 30 30
Coding Standard 代码规范(为目前的开发制定合适的规范) 30 60
Design 具体设计 120 180
Coding 具体编码 60 90
Code Review 代码复审 30 30
Test 测试(自我测试,修改代码,提交修改) 100 300
Reporting 报告 60 80
Test Repor 测试报告 60 100
Size Measurement 计算工作量 20 60
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 30 50
合计 870 1460

三、解题思路

1、从第一行开始行遍历,找到空格,并遍历空格所在的行和列,并记录行列中大于0的数

2、若该空格的候选数唯一,则写出,否则,跳过

3、当然,会出现一次遍历填不完表盘的情况,所以利用一个死循环完成表盘。当表盘中的空格数为0时,跳出循环。

#define _CRT_SECURE_NO_DEPRECATE
#include <fstream>
#include<iostream>
#include<stdio.h>
using namespace std;
int main(int argc, char *argv[])
{
	
	int m, n;
	FILE* fp1;
	FILE* fp2;
	m = atoi(argv[2]);//命令行输入的第三个参数:宫格阶级
	n = atoi(argv[4]);//命令行输入的第五个参数:待解答盘面数目
	//cin >> m >> n;
	
	//以文本只读方式打开intput.txt
	fp1 = fopen("input.txt", "r");
	if (fp1 == NULL) //打开文件失败
		return -1;
	//打开output.txt,并立即关闭,目的:清空文本内容
	fp2 = fopen("output.txt", "w");
	if (fp2 == NULL) //打开文件失败
		return -1;
	fclose(fp2);//关闭文件
	int i, j, k, num, w, p, q;
	int sudoku[10][10];
	int sign[4] = { 0 };//存放行列中已经出现的数,例如:某行或列出现3,则sign[3]=1
	fp2 = fopen("output.txt", "a");
	for (num = 0; num < n; num++)
	{
		//输入表盘的二维数组
		for (i = 0;i < m; i++)
		{
			for (j = 0;j < m;j++)
			{
				fscanf(fp1, "%d", &sudoku[i][j]);
				//cin >> sudoku[i][j];
			}

		}
		while (1)
		{
			w = 0;
			//判断表盘中是否还有空格
			for (i = 0;i < m;i++)
			{
				for (j = 0;j < m;j++)
				{
					if (sudoku[i][j] == 0)
					{
						w++;
					}

				}
			}
			if (w == 0)//表示表盘已经填完
			{
				break;
			}
			for (i = 0;i < m;i++)
			{
				for (j = 0;j < m;j++)
				{
					if (sudoku[i][j] != 0)
						continue;
					//若该空格为填入,则进行行列遍历,找到已出现的数
					if (sudoku[i][j] == 0)
					{ 
						//行遍历
						for (q = 0;q < 3;q++)
						{
							if (sudoku[i][q] != 0)
							{
								sign[sudoku[i][q]] = 1;
							}
						}
						//列遍历
						for (q = 0;q < 3;q++)
						{
							if (sudoku[q][j] != 0)
							{
								sign[sudoku[q][j]] = 1;
							}
						}
						p = 0;//p用于记录该空格的候选数数量
						for (q = 1;q < 4;q++)
						{
							if (sign[q] == 0)//表示该空格所在行列中均没有q
							{
								p++;
								k = q;
							}
						}
					}
					if (p == 1)
					{
						sudoku[i][j] = k;
						//cout<<k<<endl;
					}
					//初始化sign[]
					for (q = 0;q < 4;q++)
					{
						sign[q] = 0;
					}
				}
			}

		}
		//输出完整表盘
		for (i = 0;i < 3;i++)
		{
			for (j = 0;j < 3;j++)
			{
				fprintf(fp2, "%d ", sudoku[i][j]);
				//cout << sudoku[i][j] << " ";
				if (j == 2)
					fprintf(fp2, "
");
					//cout << endl;
			}
		}
		fprintf(fp2, "
");
	}
	return 0;
}

四、调试以及文本输入输出

之前出现了一个错误,就是在把表盘写入output.txt时,忘记打开文件了,就是语句

    fp2 = fopen("output.txt", "a");

五、心路历程与收获

(自闭大钟表演在线开花)

因为之前没有玩过数独,只是简单了解过,比如《意林》杂志倒数几页的“趣味数学”模块,以及《爱情公寓》里的数独高手陆展博,等等。所以一接触到这次的作业题目,下意识就想做做数独题感受一下,于是就下载了APP “全民数独”,做了60几题觉得自己摸清楚规律了,然后就去做高难题,结果因为眼高手低,屡屡碰壁。不甘心的我决定去网上找找解题技巧(毕竟我觉得数独游戏还是很烧脑的),于是发现了唯一法和候选数法。但我比较理解候选数法的解法所以就是用这种方法写的实现多盘三宫格代码。虽然她还是个菜鸟,但是毕竟也是我在推翻一种种解法最后得到的。最困扰我的除了代码只能跑三宫格以及还没来得及优化以外,就是vs编辑器的用法,其中上面出现的报错就让我头疼了很久,多亏了舍友大大们帮学得已经长草的我debug,发现问题并解决后,心情真的就像荒草里开花一样明朗。这次的编程体验,说实话对我来说影响不小,我也终于认清自己简单事情复杂化、做事情总爱一股傻劲儿往前的坏毛病,当然还是要再次感谢室友们,让我再次真切的体会到协作的力量。学习是永无止境的,但同时也是有根据有计划的,谨记于己。

原文地址:https://www.cnblogs.com/noapanda/p/11588225.html