设计实现
按功能建模时的划分,整个程序可分为三大块:
- 命令判断与处理
- 生成数独
- 解决数独
命令判断与处理十分简单,可以不单独写一个函数,因此还需要俩个函数,分别为:
- 解决数独函数 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;
}