软件工程实践2019第三次作业
GitHub地址:https://github.com/lllovehhh/031702232
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有点不习惯,学会了一些基本操作和分析。