软件工程实践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有点不习惯,学会了一些基本操作和分析。

posted @ 2019-09-25 21:54  lllovehhh  阅读(219)  评论(2编辑  收藏  举报