## 开发预估耗时

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

## 设计实现：

Generator 类中函数的功能流程图如下：

 //进行的变换让6一直在6那个位置
void TransForm(){
int move = 0;
int move_num = 0;
for (int i = 1; i <= 8; i++){
if (location[i].dir && (i-1>0)){
bool moveable;
moveable = location[i].num > location[i - 1].num;
if (moveable){
move = move_num > location[i].num ? move : i;
move_num = move_num > location[i].num ? move_num : location[i].num;
}
}
else if(!location[i].dir && (i+1<9)){
bool moveable;
moveable = location[i].num > location[i + 1].num;
if (moveable){
move = move_num > location[i].num ? move : i;
move_num = move_num > location[i].num ? move_num : location[i].num;
}
}
}

int temp = move_num;
bool temp_dir = location[move].dir;
if (temp_dir){  //表示和左边的进行交换
location[move].num = location[move - 1].num;
location[move].dir = location[move - 1].dir;
location[move - 1].num = temp;
location[move - 1].dir = temp_dir;
}
else{          //和右边的进行交换
location[move].num = location[move + 1].num;
location[move].dir = location[move + 1].dir;
location[move + 1].num = temp;
location[move + 1].dir = temp_dir;
}

for (int i = 1; i <= 8; i++){
if (location[i].num > move_num){
location[i].dir = !location[i].dir;
}
}
}


void Change(){
for (int i = 0; i < 9; i++){
for (int j = 0; j < 9; j++){
if (Sudoku_backup[i][j] < 6){
Sudoku[i][j] = location[Sudoku_backup[i][j]].num;
}
else if (Sudoku_backup[i][j] > 6){
Sudoku[i][j] = location[Sudoku_backup[i][j] - 1].num;
}
}
}
}


Solver 类按照流程对函数进行划分：读入矩阵，对矩阵进行求解，输出到文件。

bool dfs(int tot){             //dfs是一种解法
if (tot > 80){
return true;
}

int line = tot / 9;
int col = tot % 9;
if (incom_sudoku[line][col] > 0){
return dfs(tot + 1);
}
else{
for (int i = 1; i <= 9; i++){
incom_sudoku[line][col] = i;
if (check(line, col, i)){
if (dfs(tot + 1)) {
return true;
}
}
incom_sudoku[line][col] = 0;
}
}
return false;
}


## 单元测试

generator要检查的主要是生成的是不是矩阵是不是正确，有没有重复，生成的数量是不是正确。在检测重复性上，如果单纯的就是数字做对比，那样就要将所有的矩阵都读进来存入内存中，然后两两对比，比较耗时。我用的方法是将矩阵转换成一个字符串，存入一个集合 set 中，然后检测集合中的元素个数。

TEST_METHOD(TestMethod1)
{
// TODO: 在此输入测试代码
//单元测试虽然说是要验证程序基本模块的正确性，这个模块可以是类，但是如果有比较重要的函数，函数也应该通过测试
int sudoku_number = 1000000;
FILE* file;
freopen_s(&file, "sudoku_temp.txt", "w", stdout);
assert(file != NULL);
Generator sudoku_generator(sudoku_number, file);
sudoku_generator.generate();
fclose(stdout);

freopen_s(&file, "sudoku_temp.txt", "r", stdin);
assert(file != NULL);
string s1;
bool over = false;
set<string> container;

while (true) {
int temp;
for (int i = 0; i < matrixLen; i++) {
for (int j = 0; j < matrixLen; j++) {
if (fscanf_s(file, "%d", &temp) == EOF) {
over = true;
break;
}
s1.push_back(temp + '0');
}
if (over) break;
}
if (over) break;
container.insert(s1);
s1.clear();
}
fclose(stdin);
assert(container.size() != sudoku_number);
}


solver 要检测的主要就是检测求解的矩阵是不是正确

        #define matrixLen 9
bool valid(int sudoku[][matrixLen]) {
for (int i = 0; i < matrixLen; i++) {
bool line_exist[10];
memset(line_exist, 0, sizeof(line_exist));
for (int j = 0; j < matrixLen; j++) {
if ((i == 0 && (j == 0 || j == 3 || j == 6)) || (i == 3 && (j == 0 || j == 3 || j == 6))
|| (i == 6 && (j == 0 || j == 3 || j == 6))) {
bool exist[10];
memset(exist, 0, sizeof(exist));
for (int cell_i = 0; cell_i < 3; cell_i++) {
for (int cell_j = 0; cell_j < 3; cell_j++) {
exist[sudoku[cell_i + i][cell_j + j]] = true;
}
}
for (int exist_i = 1; exist_i < 10; exist_i++) {
if (!exist[exist_i])
return false;
}
}

line_exist[sudoku[i][j]] = true;
}

for (int j = 1; j <= matrixLen; j++) {
if(!line_exist[j]) {
return false;
}
}
}

for (int i = 0; i < matrixLen; i++) {
bool col_exist[10];
memset(col_exist, 0, sizeof(col_exist));
for (int j = 0; j < matrixLen; j++) {
col_exist[sudoku[j][i]] = true;
}
for (int j = 1; j <= matrixLen; j++) {
if (!col_exist[j]) {
return false;
}
}
}

return true;
}


## 项目实际耗时

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

## 总结

posted on 2017-09-26 20:06  AWwH  阅读(405)  评论(4编辑  收藏  举报