求解求解只学到C语言,求解课堂:
在下面的数独中,用代码求出:任意去掉两个数字,求去掉哪两个位置的数字可以得到最多的数独的解,解为几个。
数独为
#include
void PrintShudu();
void GetPossibleNum(int mask[9], int row, int col);
void FillCell(int row, int col);
int totalnum = 0; //统计个数
int num[9][9] =
{
4,0,0,9,0,0,0,0,3,
0,8,0,0,0,1,0,9,0,
0,0,5,0,2,0,7,0,0,
0,3,0,0,0,0,0,0,4,
0,0,6,7,0,3,5,0,0,
2,0,0,0,0,0,0,6,0,
0,0,7,0,3,0,6,0,0,
0,5,0,6,0,0,0,8,0,
1,0,0,0,0,9,0,0,2,
};
int main(int argc, char* argv[])
{
FillCell(0, 0);
printf("所有可能出现的数独个数为%d\n", totalnum);//输出所有个数
return 0;
}
void PrintShudu()
{
for (int i = 0; i < 9; ++i)
{
for (int j = 0; j < 9; ++j)
{
printf("%d,", num[i][j]);
}
printf("\n");
}
}
void GetPossibleNum(int mask[9], int row, int col)
{
// row
for (int c = 0; c < 9; ++c)
{
int data = num[row][c];
if (data == 0)
continue;
mask[data - 1] = 1;
}
// column
for (int r = 0; r < 9; ++r)
{
int data = num[r][col];
if (data == 0)
continue;
mask[data - 1] = 1;
}
// 3*3
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 3; ++j)
{
int data = num[i + row / 3 * 3][j + col / 3 * 3];
if (data == 0)
continue;
mask[data - 1] = 1;
}
}
}
void FillCell(int row, int col)
{
int nextRow = row;
int nextCol = col + 1;
if (nextCol == 9)
{
nextCol = 0;
nextRow = row + 1;
}
if (nextRow == 9)
{
PrintShudu();
printf("sucess!\n");
totalnum += 1;//计算所有可能出现的个数
return;
}
int data = num[row][col];
if (data == 0)
{
int possibleNum[9] = { 0 };
GetPossibleNum(possibleNum, row, col);
for (int i = 0; i < 9; ++i)
{
if (possibleNum[i] == 0)
{
num[row][col] = i + 1;
FillCell(nextRow, nextCol);
}
}
num[row][col] = 0;
}
else
{
FillCell(nextRow, nextCol);
}
}
有两个疑问