【软件工程基础】个人项目报告之求解数独

项目地址

[github]链接: https://github.com/kindoms214/Sudoku.
 
项目专栏地址: https://blog.csdn.net/kindoms214/category_9638585.html.
1、个人项目报告之可行性分析、需求分析、概要设计: https://blog.csdn.net/kindoms214/article/details/103909657.
2、个人项目报告之生成数独终局: https://blog.csdn.net/kindoms214/article/details/103964265.
3、个人项目报告之生成终局代码优化: https://blog.csdn.net/kindoms214/article/details/104001320.
4、个人项目报告之求解数独: https://blog.csdn.net/kindoms214/article/details/103997960.
5、个人项目报告之求解代码优化: https://blog.csdn.net/kindoms214/article/details/104036705.
6、个人项目报告之生成数独题目: https://blog.csdn.net/kindoms214/article/details/104017290.
7、个人项目报告之单元测试及分支覆盖率: https://blog.csdn.net/kindoms214/article/details/104041445.
 

数独题目求解

解题思路

  按照平时玩数独的习惯,当然只是针对大多数人来说,最简单的想法就是一个一个的填数然后不断的进行更改。当然也不是随随便便的就瞎填,还是得按照数独的规则进行游戏。所以在求解数独这一块,我最初的想法是利用DFS暴力求解。既然是暴力求解,那么只需要将1~9代入空格中(即“0”的位置上),然后利用数独的规则进行判断,如果填到某个空无法继续的话,就重置该空为零然后回溯到上一步,直到得到第一个解为止。因为9*9的数独在挖空在30~60之间的话,是一定会存在解的,不过因为挖空数量的不确定性,并不能保证数独的解唯一。而这种方法只能够输出第一个解,但是这也能够满足项目需求,所以这种求解数独的方法是可行的。
 

代码实现

  首先,想要求解数独,就得先将数独题目读入。像生成数独终局一样,在最初的代码中,我只是先实现了代码的读入,并没有考虑到该方法在效率上的不足,所以在实现之前,就明确了在这方面的优化进行是非常有必要的观点。

if (single_character <= '9'&& single_character >= '0')	//判断是否是有效数独数字(0表示该位为空)
			{
				s_count++;		//初值为0
				solve_sudoku[row][col] = single_character - '0';
				col++;
				if (s_count % 9 == 0)
				{
					row++;
					col = 0;
				}
			}

			//读出一整个,进行数独的求解
			if (s_count % 81 == 0)
			{
				row = 0, col = 0;
				//调用一次DFS()求解数独函数
				DFS(0);
			}

  至于DFS部分就不做过多的解释了,具体代码如下:

int DFS(int n)
{
	// 所有的都符合,退出递归
	if (n > 80)
	{
		sign = true;
		return 0;
	}
	// 当前位不为空时跳过
	if (solve_sudoku[n / 9][n % 9] != 0)
	{
		DFS(n + 1);
	}
	else
	{
		// 否则对当前位进行枚举测试 
		for (int i = 1; i <= 9; i++)
		{
			/* 满足条件时填入数字 */
			if (Check(n, i) == true)
			{
				solve_sudoku[n / 9][n % 9] = i;
				// 继续搜索
				DFS(n + 1);
				// 返回时如果构造成功,则直接退出
				if (sign == true) return 0;
				// 如果构造不成功,还原当前位
				solve_sudoku[n / 9][n % 9] = 0;
			}
		}
	}
}
发布了15 篇原创文章 · 获赞 25 · 访问量 1万+
展开阅读全文

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

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览