• poj 2676 数独问题 dfs


    题意:完成数独程序,数独要求每行每列且每个3*3矩阵都必须是1~9的数字组成。

    思路:dfs

    1. 用row[i][n] 记录第i行n存在  用col[j][n] 记录第j列n存在 grid[k][n] 记录第k个3*3中的n存在
    2. 遍历的时候,先把列遍历完然后在遍历行
    if (map[r][c])
        {
            if (c == 8) flag = dfs(r + 1, 0);
            else flag = dfs(r, c + 1);
            return flag;
        }

    现在推

    第一个矩阵为  0,0 0,1 0,2              第二个矩阵为   0,3 0,4 0,5

                           1,0 1,1 1,2                                       1,3  1,4 1,5

                            2,0 2,1 2,2                                       2,3 2,4 2,5

    如果直接 (r+c)/3有些不符合,说明应该把 r c拆开来看 所以推出 r/3*3+c/3

    解决问题的代码:

    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int maxn = 10;
    int map[maxn][maxn];
    bool row[maxn][maxn];
    bool col[maxn][maxn];
    bool grid[maxn][maxn];
    bool dfs(int r, int c)
    {
        if (r == 9) return true;//构造完毕
        bool flag = false;
        if (map[r][c])
        {
            if (c == 8) flag = dfs(r + 1, 0);
            else flag = dfs(r, c + 1);
            return flag;
        }
        int k = (r / 3) * 3 + c / 3;
        for (int i = 1; i <= 9; i++)if (!row[r][i] && !col[c][i] && !grid[k][i])
        {
            row[r][i] = col[c][i] = grid[k][i] = true;
            map[r][c] = i;
            if (c == 8) flag = dfs(r + 1, 0);
            else flag = dfs(r, c + 1);
            if (flag) return true;
            map[r][c] = 0;
            row[r][i] = col[c][i] = grid[k][i] = false;
        }
        return false;
    }
    int main()
    {
        int T; scanf("%d", &T);
        while (T--)
        {
            memset(row, 0, sizeof(row));
            memset(col, 0, sizeof(col));
            memset(grid, 0, sizeof(grid));
            for (int i = 0; i<9; i++)
                for (int j = 0; j<9; j++)
                {
                    char x;
                    scanf(" %c", &x);
                    map[i][j] = x - '0';
                    if (map[i][j])
                    {
                        row[i][map[i][j]] = true;
                        col[j][map[i][j]] = true;
                        int k = (i / 3) * 3 + j / 3;
                        grid[k][map[i][j]] = true;
                    }
                }
            dfs(0, 0);
            for (int i = 0; i<9; i++)
            {
                for (int j = 0; j<9; j++)
                    printf("%d", map[i][j]);
                printf("
    ");
            }
        }
        return 0;
    }
    君子知命不惧,自当日日自新
  • 相关阅读:
    Vue入门教程 第一篇 (概念及初始化)
    安装配置MongoDB
    Windows搭建SVN服务器
    MySql + Workbench使用教程
    Node.js入门教程 第六篇 (连接使用MySql)
    Node.js入门教程 第五篇 (Express框架)
    Node.js入门教程 第四篇 (流及文件操作)
    Node.js入门教程 第三篇 (模块、路由)
    Node.js入门教程 第二篇 (HelloWorld及事件分发)
    Node.js入门教程 第一篇 (概念原理及环境配置)
  • 原文地址:https://www.cnblogs.com/xuxiaojin/p/9406334.html
Copyright © 2020-2023  润新知