• 题解 P1074 【靶形数独 】


    这是一神题!!!

    可能是因为我太弱了,题解都看不太懂QWQ

    不过感谢wng老师的提醒,我写出了这个样的的代码。

    分析:

    这道题是一个搜索(dfs)。很神奇很暴力的题
    首先,你需要看懂题目。(可以先去玩下正常的数独,然后基本就明白了....)
    其次,应题目要求,我们使用三个数组来标记在此位置填数合不合法,然后有一个非常自然的想法,从每个位置来搜,填数后递归,填完后计算出答案,取最大值。
    不过你会发现你爆栈了!!!
    所以我开三个数组,记录行列以及九宫格的状态,只有在三个数组中都未出现的值才可以被填入,不过我是反着搜的。

    CODE:

    // luogu-judger-enable-o2
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    
    #define ll long long
    #define re register
    //define大法好!!!
    
    using namespace std;
    
    bool line[10][10],roway[10][10],nine[10][10];
    int a[10][10],b[10][10];
    int got[10][10][10];
    int ans = -1, score;
    
    inline int math_sign(int x,int y ,int z){
        if(x == 5 && y == 5)
            return 10 * z;
        else if(x >= 4 && x <= 6 && y >= 4 && y <= 6)
            return 9 * z;
        else if(x >= 3 && x <= 7 && y >= 3 && y <= 7)
            return 8 * z;
        else if(x >= 2 && x <= 8 && y >= 2 && y <= 8)
            return 7 * z;
        else return 6 * z;
    }//模拟数独的得分方式
    
    inline bool get_score(int x,int y,int z){
        if(roway[x][z] || line[y][z] || nine[(x - 1) / 3 * 3 + (y - 1) / 3][z])
            return 0;
        b[x][y] = z;
        roway[x][z] = line[y][z] = nine[(x - 1) / 3 * 3 + (y - 1) / 3][z] = 1;
        score += got[x][y][z];
        return 1;
    }
    
    inline int _read(){
        re int x = 0;
        re int flag = true;
        re int k = getchar();
        while(k != '-' && !isdigit(k))
            k = getchar();
        if(k == '-'){
           k = getchar();
           flag = false;
        }
        while(isdigit(k)){
            x = x * 10 + k - '0';
            k = getchar();
        }
        return (flag ? x : -x);
    }//读入优化,不会的可以背一下
    
    inline void del(int x,int y,int z){
        roway[x][z] = line[y][z] = nine[(x - 1) / 3 * 3 + (y - 1)/3][z] = 0;
    }
    
    void dfs(int x,int y ){
        if(x == 10 && y == 1){
            ans = max(ans,score);
            return;
        }
        if(b[x][y]){
            if(y == 9)
                dfs(x + 1, 1);
            else
                dfs(x,y + 1);
        }
        else{
            for(int i = 1 ;i <= 9 ;i++){
                int t = score;
                if(get_score(x,y,i)){
                    if(y == 9)
                        dfs(x + 1,1);
                    else
                        dfs(x,y + 1);
                    del(x,y,i);
                    score = t;
                }
            }
            b[x][y] = 0;
        }
    }
    
    int main(){
        for(int i = 1; i<= 9; i++)
            for(int j = 1; j <= 9 ;j++)
                for(int k = 1; k<= 9 ; k++)
                    got[i][j][k] = math_sign(i,j,k);
        for(int i = 9; i > 0 ; i--)
            for(int j = 9; j > 0 ; j--){
                a[i][j] = _read();
                if(a[i][j])
                    get_score(i,j,a[i][j]);
            }
        dfs(1,1);
        printf("%d",ans);
        return 0;
    }
    

    没错,我开了O2优化,额————其实是因为之前花式被卡,各种TLE,于是我就打开了氧气罐子优化QAQ。。。
    祝大家早日AC,不再TLE。(点个赞吧)

    有些路你和某人一起走,就长得离谱,你和另外一些人走,就短得让人舍不得迈开脚步。
  • 相关阅读:
    mysql新建用户的方法
    工具网站
    如何做好站内锚文本?
    js 创建对象与继承
    js tips
    js作用域链 js没有块级作用域
    css
    instanceof
    问题
    传递,引用副本传递
  • 原文地址:https://www.cnblogs.com/Repulser/p/9579866.html
Copyright © 2020-2023  润新知