跳转至

题解:B4279 [蓝桥杯青少年组国赛 2023] 数独填数

思路与算法

题目大意

题目给定一个未完成的数独(用 . 表示空格),保证有唯一解,要求输出填完后的数独。

忘记数独规则的~和不会玩数独的~看过来:

数独需要玩家在一个 \(9 \times 9\) 的网格中填入数字 \(1 \sim 9\),使得:

  1. 每一行包含 \(1 \sim 9\) 且不重复;
  2. 每一列包含 \(1 \sim 9\) 且不重复;
  3. 每一个 \(3 \times 3\) 的格子包含 \(1 \sim 9\) 且不重复。

算法

注意到,算法标签说明这是一道 DFS 题,

这里我们可以使用 DFS 遍历并枚举每一个空格所填的数,并检查是否合法。

所以,这里我们用的算法就会是 DFS(深度优先搜索)啦,也就变成了一道橙题

代码

C/C++:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <stdio.h>
#include <stdbool.h>

char board[9][9];
bool solved = false;

bool isValid(int row, int col, char num) {
    for (int i = 0; i < 9; i++) {
        if (board[row][i] == num) {
            return false;
        }
    }
    for (int i = 0; i < 9; i++) {
        if (board[i][col] == num) {
            return false;
        }
    }
    int boxRow = row / 3 * 3;
    int boxCol = col / 3 * 3;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (board[boxRow + i][boxCol + j] == num) {
                return false;
            }
        }
    }
    return true;
}

void dfs(int row, int col) {
    if (row == 9) {
        solved = true;
        return;
    }
    if (col == 9) {
        dfs(row + 1, 0);
        return;
    }
    if (board[row][col] != '.') {
        dfs(row, col + 1);
        return;
    }
    for (char num = '1'; num <= '9'; num++) {
        if (isValid(row, col, num)) {
            board[row][col] = num;
            dfs(row, col + 1);
            if (solved) {
                return;
            }
            board[row][col] = '.';
        }
    }
}

int main() {
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            scanf("%c", &board[i][j]);
        }
        getchar(); // 吃换行
    }
    dfs(0, 0);
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            printf("%c", board[i][j]);
        }
        printf("\n");
    }
    return 0;
}
其他语言(C#,Java,Python)