题目如上
利用深度搜索, 进行检索
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int sudoku[10][10];
_Bool row[10][10] = {0};
_Bool column[10][10] = {0};
_Bool square[10][10] = {0};
void DepthFirstSearch(int i, int j);
void ShowSquare(void);
int main(void)
{
//初始化
for (int i = 1; i < 10; i++)
{
for (int j = 1; j < 10; j++)
{
scanf("%d", &sudoku[i][j]);
if (sudoku[i][j] != 0)
{
row[i][sudoku[i][j]] = 1; //占位标记
column[j][sudoku[i][j]] = 1;
square[(i - 1) / 3 * 3 + (j - 1) / 3 + 1][sudoku[i][j]] = 1;
}
}
}
DepthFirstSearch(1, 1);
return 0;
}
void DepthFirstSearch(int x, int y) //深度搜索
{
if (sudoku[x][y] != 0)
{
if (x == 9 && y == 9)
ShowSquare();
if (y == 9)
DepthFirstSearch(x + 1, 1);
else
DepthFirstSearch(x, y + 1);
}
else
{
for (int i = 1; i < 10; i++)
{
if (!row[x][i] && !column[y][i] && !square[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][i]) //空位判断
{
sudoku[x][y] = i;
row[x][i] = 1;
column[y][i] = 1;
square[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][i] = 1;
if (x == 9 && y == 9)
ShowSquare();
if (y == 9)
DepthFirstSearch(x + 1, 1);
else
DepthFirstSearch(x, y + 1);
sudoku[x][y] = 0;
row[x][i] = 0;
column[y][i] = 0;
square[(x - 1) / 3 * 3 + (y - 1) / 3 + 1][i] = 0;
}
}
}
}
void ShowSquare()
{
for (int i = 1; i < 10; i++)
{
for (int j = 1; j < 10; j++)
printf("%d ", sudoku[i][j]);
putchar('\n');
}
exit(0);
}