个人项目博客(三)

设计实现

按功能建模时的划分,整个程序可分为三大块:

  1. 命令判断与处理
  2. 生成数独
  3. 解决数独

命令判断与处理十分简单,可以不单独写一个函数,因此还需要俩个函数,分别为:

  • 解决数独函数 Solve()
  • 生成数独函数 Create()

关键代码

生成数独部分

do
	{
		for (int i=0; i<9; ++i)        //生成数字交换表
			trans[g_row[0][i]-49] = arr[i];

		for (int i=0; i<9; ++i)        //生成新的终局
			for (int j=0; j<9; ++j)
				newRow[i][j] = trans[g_row[i][j]-49];

		for (int i=0; i<2 && n; i++)    //交换行
		{
			for (int j=0; j<6 && n; j++)
			{
				for (int k=0; k<6 && n; k++)
				{
					for (int m=0; m<9; ++m)
					{
						for (int n=0; n<9; ++n)
						{
							g_output[tempPointer++] = newRow[order[m]][n]+'0';
							if (n==8)
								g_output[tempPointer++]='\n';
							else
								g_output[tempPointer++]=' ';
						}
					}
					if (--n)
						g_output[tempPointer++] = '\n';
					else
						return;
					next_permutation(order+6, order + 9);
				}
				next_permutation(order+3, order+6);
			}
			next_permutation(order+1, order+3);
		}
	} while (next_permutation(arr+1, arr+9));    //改变数字交换顺序

解决数独部分

//DFS前处理部分
if (unsolvedSudoku[r][c] == 0)   //空白格子处理
{
	blank[blankCounter][0] = r;
	blank[blankCounter][1] = c;
	blankCounter++;
}
else                            //数字处理
{
	SetMark(r, c, unsolvedSudoku[r][c], 1);
	row[r]++;
	col[c]++;
	block[BlockNum(r, c)]++;
}

//DFS部分
bool DFS(int deep)
{
	if (deep==blankCounter)                       
	{
		return true;
	}

	int r=blank[deep][0], c=blank[deep][1];
	for (int i=1; i<10; i++)
	{
		if (!rowMark[r][i] && !colMark[c][i] && !blockMark[BlockNum(r, c)][i])
		{
			unsolvedSudoku[r][c] = i;
			SetMark(r, c, unsolvedSudoku[r][c], 1); 
			if (DFS(deep+1))
				return true;
			SetMark(r, c, unsolvedSudoku[r][c], 0); 
			unsolvedSudoku[r][c] = 0;
		}
	}
	return false;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值