PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
Planning | 计划 | 0.5h | 1h |
Estimate | 估计这个任务需要多少时间 | 19.5h | 28h |
Development | 开发 | 3h | 5h |
Analysis | 需求分析(包括学习新技术) | 3h | 5h |
Design Spec | 生成设计文档 | 1h | 3h |
Design Review | 设计复审 | 0.5h | 0.5h |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 0.5h | 0.5h |
Design | 具体设计 | 1h | 1h |
Coding | 具体编码 | 4h | 5h |
Code Review | 代码复审 | 1h | 1h |
Test | 测试(自我测试,修改代码,提交修改) | 2h | 3h |
Reporting | 报告 | 0.5h | 0.5h |
Test Repor | 测试报告 | 0.5h | 0.5h |
Size Measurement | 计算工作量 | 1.5h | 1.5h |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 0.5h | 0.5h |
合计 | 19.5h | 28h |
代码
主函数,用的是深度搜索。4、6、8、9是有宫的,分四个不同的函数搜索。3、5、6是无宫的,可以放在一起。
int main(int argc, char** argv) { ifstream infile; ofstream outfile; if (argc == 1) { m = 3, n = 1; outfile.open("g:\\软工实践\\output.txt"); infile.open("g:\\软工实践\\input.txt"); } else { m = atoi(argv[2]); n = atoi(argv[4]); outfile.open("g:\\软工实践\\output.txt"); infile.open("g:\\软工实践\\input.txt"); } while (n--) { for (int i = 1; i <= m; i++) for (int j = 1; j <= m; j++) { char c; infile >> c; int t; t = c - 48; if (t != 0) { if (m == 3 || m == 5 || m == 7) p[i][t] = l[j][t] = fz[i][j] = true; if (m == 4) p[i][t] = l[j][t] = fz[(i - 1) / 2 * 2 + (j - 1) / 2 + 1][t] = true; if (m == 6) p[i][t] = l[j][t] = fz[(i - 1) / 2 * 2 + (j - 1) / 3 + 1][t] = true; if (m == 8) p[i][t] = l[j][t] = fz[(i - 1) / 4 * 4 + (j - 1) / 2 + 1][t] = true; if (m == 9) p[i][t] = l[j][t] = fz[(i - 1) / 3 * 3 + (j - 1) / 3 + 1][t] = true; } sd[i][j] = t; } if (m == 3 || m == 5 || m == 7) dfsm(1, 1); if (m == 4) dfs4(1, 1); if (m == 6) dfs6(1, 1); if (m == 8) dfs8(1, 1); if (m == 9) dfs9(1, 1); memset(p, 0, sizeof(p)); memset(l, 0, sizeof(l)); memset(fz, 0, sizeof(fz)); } //cout<<"k="<<k<<endl;outfile <<"k="<<k<<endl for (int i = 1; i < k; i++) { cout << sudoku[i] << " "; outfile << sudoku[i] << " "; if (i%m == 0) { cout << endl; outfile << endl; //cout<<"i="<<i<<endl;outfile <<"i="<<i<<endl if(i%(m*m)==0) { cout << endl; outfile << endl; } } } return 0; }
深度搜索函数,有宫的时候,比如九宫格,每增加三行,宫格序号加三,每增加三列,宫格序号加一。
void dfsm(int x, int y) { ; if (sd[x][y] != 0)//如果原来这个位置有数字,跳过。 if (x == m && y == m) out(); else if (y == m)dfsm(x + 1, 1); else dfsm(x, y + 1); else//原来的地方没有数字,准备填充 for (int i = 1; i <= m; i++) if ((!p[x][i]) && (!l[y][i])) { sd[x][y] = i; p[x][i] = l[y][i] = true; if (x == m && y == m) out(); else if (y == m)dfsm(x + 1, 1); else dfsm(x, y + 1); sd[x][y] = 0; p[x][i] = l[y][i] = false; } } void dfs4(int x, int y) { if (sd[x][y] != 0) if (x == 4 && y == 4) out(); else if (y == 4)dfs4(x + 1, 1); else dfs4(x, y + 1); else for (int i = 1; i <= 4; i++) if ((!p[x][i]) && (!l[y][i]) && (!fz[(x - 1) / 2 * 2 + (y - 1) / 2 + 1][i])) { sd[x][y] = i; p[x][i] = l[y][i] = fz[(x - 1) / 4 * 4 + (y - 1) / 2 + 1][i] = true; if (x == 4 && y == 4) out(); else if (y == 4)dfs4(x + 1, 1); else dfs4(x, y + 1); sd[x][y] = 0; p[x][i] = l[y][i] = fz[(x - 1) / 2 * 2 + (y - 1) / 2 + 1][i] = false; } } void dfs6(int x, int y) { if (sd[x][y] != 0) if (x == 6 && y == 6) out(); else if (y == 6)dfs6(x + 1, 1); else dfs6(x, y + 1); else for (int i = 1; i <= 6; i++) if ((!p[x][i]) && (!l[y][i]) && (!fz[(x - 1) / 2 * 2 + (y - 1) / 3 + 1][i])) { sd[x][y] = i; p[x][i] = l[y][i] = fz[(x - 1) / 2 * 2 + (y - 1) / 3 + 1][i] = true; if (x == 6 && y == 6) out(); else if (y == 6)dfs6(x + 1, 1); else dfs6(x, y + 1); sd[x][y] = 0; p[x][i] = l[y][i] = fz[(x - 1) / 2 * 2 + (y - 1) / 3 + 1][i] = false; } } void dfs8(int x, int y) { if (sd[x][y] != 0) if (x == 8 && y == 8) out(); else if (y == 8)dfs8(x + 1, 1); else dfs8(x, y + 1); else for (int i = 1; i <= 8; i++) if ((!p[x][i]) && (!l[y][i]) && (!fz[(x - 1) / 4 * 4 + (y - 1) / 2 + 1][i])) { sd[x][y] = i; p[x][i] = l[y][i] = fz[(x - 1) / 4 * 4 + (y - 1) / 2 + 1][i] = true; if (x == 8 && y == 8) out(); else if (y == 8)dfs8(x + 1, 1); else dfs8(x, y + 1); sd[x][y] = 0; p[x][i] = l[y][i] = fz[(x - 1) / 4 * 4 + (y - 1) / 2 + 1][i] = false; } } void dfs9(int x, int y) { if (sd[x][y] != 0) if (x == 9 && y == 9) out(); else if (y == 9)dfs9(x + 1, 1); else dfs9(x, y + 1); else for (int i = 1; i <= 9; i++) if ((!p[x][i]) && (!l[y][i]) && (!fz[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][i])) { sd[x][y] = i; p[x][i] = l[y][i] = fz[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][i] = true; if (x == 9 && y == 9) out(); else if (y == 9)dfs9(x + 1, 1); else dfs9(x, y + 1); sd[x][y] = 0; p[x][i] = l[y][i] = fz[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][i] = false; } }
存数组,有n个数独,每个将其存到sudoku数组中
void out() { for (int i = 1; i <= m; i++) { for (int j = 1; j <= m; j++) { sudoku[k++] = sd[i][j]; } } // memset(sd, 0, sizeof(sd)); }
一些头文件,注意#include<bits/stdc++.h>这个万能头文件vs里
#include <bits/stdc++.h> #include<fstream> using namespace std; int sd[11][11], m, sudoku[100000] = { 0 }, k = 1,n,t;//数独数组,n宫格 bool p[11][11], l[11][11], fz[11][11];//排,列,方阵。
测试数据
三宫格

四宫格

五宫格

六宫格

七宫格

八宫格

性能分析
总结
首先,数独需要用到深度搜索,这个知识点有点忘记,花了一定的时间去复习。然后文件的输入输出这一块我弄了好久,也问了好多大佬最后才修改成现在的样子,勉强能用吧。最后就是devc用多了,一下子改到vs有点不习惯,学会了一些基本操作和分析。