1.Github项目地址
(https://github.com/Arno1999wu/homework)
2.PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 15 | 20 |
Estimate | 估计这个任务需要多少时间 | 15 | 20 |
Development | 开发 | 600 | 1090 |
Analysis | 需求分析 (包括学习新技术) | 180 | 210 |
Design Spec | 生成设计文档 | 0 | 0 |
Design Review | 设计复审 | 0 | 0 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 0 | 0 |
Design | 具体设计 | 30 | 40 |
Coding | 具体编码 | 210 | 200 |
Code Review | 代码复审 | 60 | 40 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 600 |
Reporting | 报告 | 120 | 180 |
Test Repor | 测试报告 | 30 | 50 |
Size Measurement | 计算工作量 | 30 | 40 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 90 |
合计 | 735 | 1290 |
3.思路
仅适用于三阶。
①对输入的数独逐行求和,第一个不为0的行即为第一个数所在,记录下第一个数3及其所在行,同理可找到第二个数2;
| 0 | 0 | 3 |
| 2 | 0 | 0 |
| 0 | 0 | 0 |
②对第二个数所在行进行逐列求和,和等于0即填入第一个数3,和等于第一个数即填入剩余的数1;
| 0 | 0 | 3 |
| 2 | 3 | 1 |
| 0 | 0 | 0 |
③回到第一个数所在行,逐列求和,和为第一个数即填入第二个数2,和为第二个数即填入剩余数1;
| 1 | 2 | 3 |
| 2 | 3 | 1 |
| 0 | 0 | 0 |
④到剩余行,每个空都为sum=6减去列求和的值;
| 1 | 2 | 3 |
| 2 | 3 | 1 |
| 3 | 1 | 2 |
当有多个数独时,传入一个参数n进行行的变换。
行求和函数
int row(int m, int *a, int r,int n)
{
int rsum = 0 , j;
for (j = 0; j < m; j++)
rsum += *(a + (__int64)r * m + 9 * (__int64)n + j);
return rsum;
}
列求和函数
int column(int m, int *a, int c,int n)
{
int csum = 0, i;
for (i = 0; i < m; i++)
csum += *(a + (__int64)m * i + 9* (__int64)n + c);
return csum;
}
4.分析并消除所有的警告
VS2017通过以下步骤进行警告的分析
分析后产生4条一类警告(C26451)
通过以下操作消除了警告
5.性能分析
分析后发现从文件中读取数独耗费了太多cpu时间,但目前没想到方法改进
6.源代码
#include
#include
#include
#include
#include
using namespace std;
//对行进行和处理
int row(int m, int *a, int r,int n)
{
int rsum = 0 , j;
for (j = 0; j < m; j++)
rsum += *(a + (__int64)r * m + 9 * (__int64)n + j);
return rsum;
}
//
//对列进行和处理
int column(int m, int *a, int c,int n)
{
int csum = 0, i;
for (i = 0; i < m; i++)
csum += *(a + (__int64)m * i + 9* (__int64)n + c);
return csum;
}
//
int main(int argc,char *argv[])
{
//三阶盘面
int m = atoi(argv[2]);
if (m == 3)//atoi->将字符串转换为整型
{
int i, j, n = 0, sum = 0;
//从input中导入数独
ifstream fin("input.txt");
ofstream fout("output.txt");
int a[100][3];
for (i = 1; i <= 3*(atoi(argv[4])); i++)
for (j = 0; j < 3; j++)
{
fin >> a[i - 1][j];
}
for (i = 1; i <= m; i++)
sum += i;
//
//填数
while (n < atoi(argv[4]))
{
int f_num = 0, s_num = 0, k = 0, r, c;
for (i = 3 * n; (i - 3 * n) < m; i++)//找出第一个数的值及其所在行
{
r = row(3, (int*)a, i - 3 * n, n);
if (r != 0)
{
f_num = r;
k = i;
break;
}
}
for (i = k + 1; (i - 3 * n) < m; i++)//找出第二个数的值
{
r = row(3, (int*)a, (i - 3 * n), n);
if (r != 0)
{
s_num = r;
break;
}
}
for (j = 0; j < m; j++)//将第二个数所在行填满
{
c = column(3, (int *)a, j, n);
if (c == 0)
a[i][j] = f_num;
if (c == f_num)
a[i][j] = (sum - f_num - s_num);
}
for (j = 0; j < m; j++)//回到第一个数所在行填满
{
if (a[k][j] == 0)
{
c = column(3, (int *)a, j, n);
if (c == f_num)
a[k][j] = s_num;
if (c == s_num)
a[k][j] = (sum - f_num - s_num);
}
}
for (i = 0; i < m; i++)//将剩余一行填满
{
r = row(3, (int *)a, i, n);
if (r == 0)
{
for (j = 0; j < m; j++)
{
c = column(3, (int *)a, j, n);
a[i + 3 * n][j] = sum - c;
}
}
}
//
n++;
//输出填好的数独
if (n == atoi(argv[4]))
{
for (i = 1; i <= 30; i++)
for (j = 0; j < 3; j++)
{
fout << a[i - 1][j] << " ";
if (j == 2)
{
fout << endl;
if ((i % 3) == 0)
fout << endl;
}
}
fin.close();
fout.close();
cin.get();
}
//
}
exit(0);
}
//
else
cout << "can't deal" << endl;
return 0;
}
7.总结收获
通过这次经历,学会了VS2017的基本使用、Github采集仓库文件夹及上传本地文件,C++的一些操作以及一些七七八八的东西,从没想过一周内可以学怎么多新知识,果然,压力也是动力。
我发现虽然有很多东西不懂,但只要锲而不舍的去查去学,总能有所收获。
通过这次,我深刻的体会到计划是多么重要,刚开始没计划,想到什么些什么,调我这次从三阶开始想,想到一个方法就很快开始写,写完之后才发现这个方法根本无法扩展到高阶,而时间又不允许重新开始写,
导致这次的结果只能解决三阶问题,而且调试的时候也很痛苦,以后一定得提前规划好。