个人项目-数独的生成与求解(4)

个人项目-数独的生成与求解(4)

代码改进及性能分析

在编写代码的过程中做过几次的改动,最开始生成初始数独是通过随机生成数字排列再通过移动第一行来实现的,之后觉得这种方法有一些麻烦并且费时间,所以最后放弃了这种方法,使用了模板的方法来生成初始数独,前面博客展示出的类已经是修改过后的代码。读写文件这一部分也做了适当的修改,尝试过几种读写文件的方法,最终选择创建大数组并一次性将文件的所有信息写入。修改代码大致花费了三个小时时间。
最后的性能分析如下图
生成数独过程:
在这里插入图片描述
generate_sudoku函数最为耗时,函数中最耗时的部分是文件的写入,其次是全排列的生成
在这里插入图片描述
求解数独的过程:
在这里插入图片描述
最耗时的部分是文件的写入
在这里插入图片描述

关键代码展示

生成数独:(函数的实现过程在前面博客中有说明)

void generator::generate_sudoku(int num)
{
	int first[] = { 5,1,2,3,4,6,7,8,9 };//第一行
	int row_order[] = { 0,1,2,3,4,5,6,7,8 };//行顺序
	do {
		initialize(first);//生存应该初始数独终局
		do {
			do {
				do
				{
					for (int i = 0; i < 9; i++)
					{
						for (int j = 0; j < 8; j++)
						{
							output[point++] = now[row_order[i]][j] + '0';
							output[point++] = ' ';
						}
						output[point++] = now[row_order[i]][8] + '0';
						output[point++] = '\n';
					}
					if(num > 1) output[point++] = '\n';//一个终局完成
					num--;
				} while (next_permutation(row_order + 6, row_order + 9) && num);
			} while (next_permutation(row_order + 3, row_order + 6) && num);
		} while (next_permutation(row_order + 1, row_order + 3) && num);
	} while (next_permutation(first + 1, first + 9) && num > 1);

	Write();
	return;
}

求解数独:

void solver::solve_sudoku(string path)
{
	//从文件中读出数独
	ifstream readfile(path);
	if (!readfile)
	{
		cout << "Can not find file!" << endl;
		return;
	}
	int k = 0;
	while (!readfile.eof())
	{
		readfile >> input[k++];
	}
	readfile.close();

	int p = 0;
	while (p < k)
	{

		if (input[p] == ' ' || input[p] == '\n')
		{
			p++;
			continue;
		}

		int count = 0;
		for (int i = 0; i < 9; i++)
		{
			for (int j = 0; j < 9; j++)
			{
				if (input[p] == ' ')
				{
					p++;
					j--;
					continue;
				}
				int tmp = input[p++] - '0';
				if (tmp == 0)
				{
					need_solve[count++] = i * 9 + j;//需要求解的位置
				}
				else
				{
					setnum(i, j, tmp, 1);//已有数字记录
				}
			}
		}

		dfs(0, count);
		print_output();

		for (int i = 0; i < 10; i++)
		{
			for (int j = 0; j < 10; j++)
			{
				row_mark[i][j] = 0;
				col_mark[i][j] = 0;
				block_mark[i][j] = 0;
				a[i][j] = 0;
			}
		}
	}
	Write();
	return;
}

PSP表格

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

GUI

完成数独项目后,我又设计实现了UI界面的设计编写。UI界面上包括四个按钮,点击开始按钮生成初始的数独,点击下一题则跳到下一题,点击完成则对当前完成的数独进行检查,若填入不正确则提示数独存在错误,若填入数独正确则提示数独正确,点击退出即可退出窗口。
GUI

发布了4 篇原创文章 · 获赞 0 · 访问量 71
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览