zoukankan      html  css  js  c++  java
  • Sudoku

    https://vjudge.net/problem/HRBUST-1955

    9 * 9 的 Sudoku 给每个格子标号 num 并且通过标号唯一确定格子的位置在 num / 9 行 num % 9 列 

    判断待定数字是不是在每行每列每宫中没有出现过 如果可以顺利搜索完所有格子 ans 标为 1 如果搜索完 ans 不是 1 那么无解

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    const int maxn = 12;
    int T;
    char s[maxn][maxn];
    int a[maxn][maxn];
    int r[maxn][maxn], c[maxn][maxn], g[maxn][maxn];
    
    int G[maxn][maxn];
    
    int ans;
    
    void init() {
        ans = 0;
        memset(r, 0, sizeof r);
        memset(c, 0, sizeof c);
        memset(g, 0, sizeof g);
    }
    
    // 求第几宫
    int u(int x, int y) {
        x = x / 3;
        y = y / 3;
        return 3 * x + y;
    }
    
    void dfs(int num) {
        if(num == 81) {
            ans = 1;
            return;
        }
    
        int x = num / 9, y = num % 9;
        if(a[x][y] != 0) {
            dfs(num + 1);
            if(ans == 1) return;
        } else {
            for(int i = 1; i <= 9; i ++) {
                if(r[x][i] || c[y][i] || g[G[x][y]][i]) continue;
                a[x][y] = i;
                r[x][i] = 1;
                c[y][i] = 1;
                g[G[x][y]][i] = 1;
    
                dfs(num + 1);
                if(ans == 1) return;
    
                a[x][y] = 0;
                r[x][i] = 0;
                c[y][i] = 0;
                g[G[x][y]][i] = 0;
            }
        }
    }
    
    int main() {
        scanf("%d", &T);
        for(int cas = 1; cas <= T; cas ++) {
            init();
            
            for(int i = 0; i < 9; i ++) {
                scanf("%s", s[i]);
                for(int j = 0; s[i][j]; j ++) {
                    G[i][j] = u(i, j);
                    if(s[i][j] == '*') s[i][j] = '0';
                    a[i][j] = s[i][j] - '0';
                    if(a[i][j] != 0) {
                        r[i][a[i][j]] = 1; // 第 i 行已经出现了 a[i][j]
                        c[j][a[i][j]] = 1; // 第 j 列已经出现了 a[i][j]
                        g[G[i][j]][a[i][j]] = 1; // 第 G(i, j) 宫已经出现了 a[i][j]
                    }
                }
            }
    
            dfs(0);
    
            if(ans == 1) {
                for(int i = 0; i < 9; i ++) {
                    for(int j = 0; j < 9; j ++) {
                        printf("%d", a[i][j]);
                    }
                    printf("
    ");
                }
                printf("
    ");
            } else {
                printf("No solution
    ");
            }
    
        }
        return 0;
    }
    View Code

     

  • 相关阅读:
    文字无缝滚动效果,鼠标移入时暂停
    Spring中使用@Autowired注解静态实例对象
    服务器环境搭建
    nexus问题
    useUnicode=true&characterEncoding=UTF-8 的作用
    SpringBoot项目启动时自动执行指定方法
    springboot自定义消息转换器HttpMessageConverter
    kubernetes资源类别介绍
    红黑树与平衡二叉树的比较
    Feign Client的超时时间
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/10405821.html
Copyright © 2011-2022 走看看