• 【CodeVS】p1174 靶形数独


    题目描述 Description

    小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他
    们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,
    Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目。
    靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有9 个3 格宽×3 格
    高的小九宫格(用粗黑色线隔开的)。在这个大九宫格中,有一些数字是已知的,根据这些

    数字,利用逻辑推理,在其他的空格上填入1 到9 的数字。每个数字在每个小九宫格内不能
    重复出现,每个数字在每行、每列也不能重复出现。但靶形数独有一点和普通数独不同,即
    每一个方格都有一个分值,而且如同一个靶子一样,离中心越近则分值越高。

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

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

    输入描述 Input Description

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

    输出描述 Output Description

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

    样例输入 Sample Input

    【输入输出样例 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

    【输入输出样例 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

    样例输出 Sample Output

    【输入输出样例 1】

    2829

    【输入输出样例 1】

    2852

    数据范围及提示 Data Size & Hint

    【数据范围】
    40%的数据,数独中非0 数的个数不少于30。
    80%的数据,数独中非0 数的个数不少于26。
    100%的数据,数独中非0 数的个数不少于24。

    思路:搜索无疑,正解A*,然而不会,爆搜过了,从右下角开始搜就能过,左上角搜T了两个点,因为数据右下部分确定的数多。

    Source:

     1 #include <iostream>
     2 #include <cstdio>
     3 using namespace std;
     4 int sum,maxsum;
     5 int a[10][10],h[10][10],l[10][10],jgg[10][10];
     6 int cj[10][10]=
     7     {{0,0,0,0,0,0,0,0,0,0},
     8      {0,6,6,6,6,6,6,6,6,6},
     9      {0,6,7,7,7,7,7,7,7,6},
    10      {0,6,7,8,8,8,8,8,7,6},
    11      {0,6,7,8,9,9,9,8,7,6},
    12      {0,6,7,8,9,10,9,8,7,6},
    13      {0,6,7,8,9,9,9,8,7,6},
    14      {0,6,7,8,8,8,8,8,7,6},
    15      {0,6,7,7,7,7,7,7,7,6},
    16      {0,6,6,6,6,6,6,6,6,6}};
    17 int zh(int x,int y)
    18 {
    19     return (x-1)/3*3+(y-1)/3+1;
    20 }
    21 void dfs(int x,int y)
    22 {
    23     int i;
    24     if (a[x][y]==0)
    25         for (i=1;i<=9;i++)
    26         {
    27             if ((!h[x][i]) && (!l[y][i]) && (!jgg[zh(x,y)][i]))
    28             {
    29                 h[x][i]=true;
    30                 l[y][i]=true;
    31                 jgg[zh(x,y)][i]=true;
    32                 sum+=i*cj[x][y];
    33                 if ((x==1) && (y==1))
    34                 {
    35                     if (sum>maxsum)
    36                         maxsum=sum;
    37                 //    return;
    38                 }
    39                 else    
    40                 if (y>1)
    41                     dfs(x,y-1);
    42                 else
    43                 //    if (y==1)
    44                         dfs(x-1,9);
    45                 h[x][i]=false;
    46                 l[y][i]=false;
    47                 jgg[zh(x,y)][i]=false;
    48                 sum-=i*cj[x][y];
    49             }
    50         }
    51     else
    52         if ((x==1) && (y==1))
    53         {
    54             if (sum>maxsum)
    55             maxsum=sum;
    56             //    return;
    57         }
    58         else    
    59             if (y>1)
    60                 dfs(x,y-1);
    61             else
    62                 dfs(x-1,9);
    63         
    64 }
    65 int main()
    66 {
    67     int i,j;
    68     maxsum=-1;
    69     for (i=1;i<=9;i++)
    70         for (j=1;j<=9;j++)
    71         {
    72             scanf("%d",&a[i][j]);
    73             if (a[i][j]!=0)
    74             {
    75                 sum+=a[i][j]*cj[i][j];
    76                 h[i][a[i][j]]=true;
    77                 l[j][a[i][j]]=true;
    78                 jgg[zh(i,j)][a[i][j]]=true;
    79             }
    80         }
    81     dfs(9,9);
    82     printf("%d",maxsum);
    83     return 0;
    84 }
    —Anime Otaku Save The World.
  • 相关阅读:
    机器学习入门-贝叶斯垃圾邮件过滤(原理)
    机器学习入门-贝叶斯拼写纠错实例
    机器学习入门-贝叶斯算法(原理)
    机器学习入门-集成算法(bagging, boosting, stacking)
    高并发网站技术架构
    Nginx教程
    Shell脚本部分语法
    关于文本处理sort-cut-wc详解
    vim操作命令
    修改Linux基本配置
  • 原文地址:https://www.cnblogs.com/DMoon/p/4915604.html
Copyright © 2020-2023  润新知