5 条题解

  • 0
    @ 2023-7-17 11:29:24
    #include<iostream>
    #include<cstdio>
    #include<iomanip>
    #include<cmath>
    #include<bits/stdc++.h>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<stack>
    #include<queue>
    #define LL long long
    using namespace std;
    const int INF=0x3f3f3f3f;
    const int N=1e5+10;
    string s;
    int a[15][15];
    int h[15],l[15],g[15];
    int sum[520];
    void init() {
        for(int i = 0 ; i < 10 ; i++)
            h[i] = l[i] = g[i] = 511;
    }
    int find(int i, int j) {
        return h[i] & l[j] & g[ i/3*3 + j/3 ];
    }
    bool dfs() {
        int ans = 10;
        int x,y;
        for(int i = 0 ; i < 9 ; i++)
            for(int j = 0 ; j < 9 ; j++)
                if(a[i][j] == 0) {
                    int k = sum[ find(i,j) ];
                    if(ans > k)
                        ans = k , x = i, y = j;
                }
        if(ans == 10)
            return true;
        int num = find(x,y);
        for(int i = 0 ; i < 9 ; i++) {
            int p = (1<<i);
            if( num & p ) {
                h[x] -= p;
                l[y] -= p;
                g[ x/3*3 + y/3 ] -= p;
                a[x][y] = i+1;
                if(dfs())
                    return true;
                h[x] += p;
                l[y] += p;
                g[ x/3*3 + y/3 ] += p;
                a[x][y] = 0;
            }
        }
        return false;
    }
    int main() {
        for(int i = 0 ; i < 512 ; i++) {
            int j = i;
            while(j) {
                j =j - (j&-j);
                sum[i]++;
            }
        }
    
        while(cin >> s && s != "end") {
            memset(a,0,sizeof a);
            init();
            for(int i = 0 ; i  < 81 ; i++) {
                int x;
                if(s[i] == '.') x = 0;
                else x = s[i] - 48;
                a[i/9][i%9] = x;
            }
            for(int i = 0 ; i < 9 ; i++) {
                for(int j = 0 ; j  < 9 ; j++) {
                    if(a[i][j] != 0) {
                        int num = 1 << (a[i][j] - 1);
                        h[i] -= num;
                        l[j] -= num;
                        g[ i/3*3 + j/3 ] -= num;
                    }
                }
            }
            dfs();
            for(int i = 0 ; i < 9 ; i++)
                for(int j = 0 ; j < 9 ; j++)
                    cout << a[i][j] ;
            cout << endl;
        }
    }
    
    
    
    

    信息

    ID
    77
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    272
    已通过
    101
    上传者