• 洛谷-P1074 靶形数独


    洛谷-P1074 靶形数独

    原题链接:https://www.luogu.com.cn/problem/P1074


    题目描述

    小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目。

    靶形数独的方格同普通数独一样,在 9 格宽且 9 格高的大九宫格中有 9 个 3 格宽且 3 格高的小九宫格(用粗黑色线隔开的)。在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空格上填入 1 到 9 的数字。每个数字在每个小九宫格内不能重复出现,每个数字在每行、每列也不能重复出现。但靶形数独有一点和普通数独不同,即每一个方格都有一个分值,而且如同一个靶子一样,离中心越近则分值越高。(如图)

    img

    上图具体的分值分布是:最里面一格(黄色区域)为 10 分,黄色区域外面的一圈(红色区域)每个格子为 9 分,再外面一圈(蓝色区域)每个格子为 8 分,蓝色区域外面一圈(棕色区域)每个格子为 7 分,最外面一圈(白色区域)每个格子为 6 分,如上图所示。比赛的要求是:每个人必须完成一个给定的数独(每个给定数独可能有不同的填法),而且要争取更高的总分数。而这个总分数即每个方格上的分值和完成这个数独时填在相应格上的数字的乘积的总和

    总分数即每个方格上的分值和完成这个数独时填在相应格上的数字的乘积的总和。如图,在以下的这个已经填完数字的靶形数独游戏中,总分数为 2829。游戏规定,将以总分数的高低决出胜负。

    img

    由于求胜心切,小城找到了善于编程的你,让你帮他求出,对于给定的靶形数独,能够得到的最高分数。

    输入格式

    一共 9 行。每行 9 个整数(每个数都在 (0 sim 9) 的范围内),表示一个尚未填满的数独方格,未填的空格用“0”表示。每两个数字之间用一个空格隔开。

    输出格式

    输出共 1 行。输出可以得到的靶形数独的最高分数。如果这个数独无解,则输出整数 −1。

    输入输出样例

    输入 #1

    7 0 0 9 0 0 0 0 1 
    1 0 0 0 0 5 9 0 0 
    0 0 0 2 0 0 0 8 0 
    0 0 5 0 2 0 0 0 3 
    0 0 0 0 0 0 6 4 8 
    4 1 3 0 0 0 0 0 0 
    0 0 7 0 0 2 0 9 0 
    2 0 1 0 6 0 8 0 4 
    0 8 0 5 0 4 0 1 2
    

    输出 #1

    2829
    

    输入 #2

    0 0 0 7 0 2 4 5 3 
    9 0 0 0 0 8 0 0 0 
    7 4 0 0 0 5 0 1 0 
    1 9 5 0 8 0 0 0 0 
    0 7 0 0 0 0 0 2 5 
    0 3 0 5 7 9 1 0 8 
    0 0 0 6 0 1 0 0 0 
    0 6 0 9 0 0 0 0 1 
    0 0 0 0 0 0 0 0 6
    

    输出 #2

    2852
    

    说明/提示

    数据规模与约定

    • 对于 40% 的数据,数独中非 0 数的个数不少于 30;
    • 对于 80% 的数据,数独中非 0 数的个数不少于 26;
    • 对于 100% 的数据,数独中非 0 数的个数不少于 24。

    C++代码(O2优化)

    #include <iostream>
    using namespace std;
    
    struct node {
        int x,y;
    };
    int a[10][10],col[10][10],row[10][10],block[10][10],ans=-1;
    int score[10][10]=
    {{0,0,0,0,0,0,0,0,0,0},
    {0,6,6,6,6,6,6,6,6,6},
    {0,6,7,7,7,7,7,7,7,6},
    {0,6,7,8,8,8,8,8,7,6},
    {0,6,7,8,9,9,9,8,7,6},
    {0,6,7,8,9,10,9,8,7,6},
    {0,6,7,8,9,9,9,8,7,6},
    {0,6,7,8,8,8,8,8,7,6},
    {0,6,7,7,7,7,7,7,7,6},
    {0,6,6,6,6,6,6,6,6,6}};
    
    int belong(int x, int y) {
        return (x-1)/3*3+(y+2)/3;
    }
    
    node nextxy() {
        node p;
        int i,j,cx=10,cy=10;
        for(i=1;i<=9;++i)
            if(cx>a[i][0]&&a[i][0]!=0)
                p.x=i,cx=a[i][0];
        if(cx==10) {
            p.x=p.y=-1;
            return p;
        }
        for(i=1;i<=9;++i)
            if(a[p.x][i]==0&&cy>a[0][i])
                p.y=i,cy=a[0][i];
        return p;
    }
    
    void dfs(node p) {
        if(p.x==-1) {
            int i,j,s=0;
            for(i=1;i<=9;++i)
                for(j=1;j<=9;++j)
                    s+=a[i][j]*score[i][j];
            if(ans<s)
                ans=s;
            return ;
        }
        int i,b=belong(p.x,p.y);
        for(i=1;i<=9;++i)
            if(col[p.x][i]==0&&row[p.y][i]==0&&block[b][i]==0) {
                a[p.x][p.y]=i;
                col[p.x][i]=row[p.y][i]=block[b][i]=1;
                --a[p.x][0],--a[0][p.y];
                dfs(nextxy());
                a[p.x][p.y]=0;
                col[p.x][i]=row[p.y][i]=block[b][i]=0;
                ++a[p.x][0],++a[0][p.y];
            }
    }
    
    int main() {
        int i,j;
        for(i=1;i<=9;++i)
            for(j=1;j<=9;++j)
                cin>>a[i][j];
        for(i=1;i<=9;++i)
            for(j=1;j<=9;++j)
                if(a[i][j]==0) {
                    ++a[i][0];
                    ++a[0][j];
                }
                else {
                    col[i][a[i][j]]=1;
                    row[j][a[i][j]]=1;
                    block[belong(i,j)][a[i][j]]=1;
                }
        dfs(nextxy());
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    Linux下安装Tomcat服务器
    记一次操蛋的:Could not find parameter map java.lang.Long
    在IDEA中使用MyBatis Generator逆向工程生成代码
    理解jquery的$.extend()、$.fn和$.fn.extend()
    在 Win10 系统下安装 JDK 及配置环境变量的方法
    怎样设置才能允许外网访问MySQL
    基于JavaMail的Java邮件发送:简单邮件发送Demo
    前端学习第57天 背景样式、精灵图、盒子模型布局细节、盒子模型案例、w3c主页
    前端学习第56天高级选择器、盒子模型、边界圆角、其他属性
    前端学习第55天 css三种引用、‘引用的优先级’、基本选择器、属性、display
  • 原文地址:https://www.cnblogs.com/yuzec/p/12941218.html
Copyright © 2020-2023  润新知