zoukankan      html  css  js  c++  java
  • 【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.
  • 相关阅读:
    中序遍历
    二叉树前序遍历
    A Real Stewart
    走遍美国 听写
    2016-12-12——2016-12-16友邻
    英语百日听力
    6.2分鱼问题两种解法
    Bootstrap组件1
    Bootstrap图标及另一个好用图标网站介绍
    Bootstrap全局CSS样式之图片
  • 原文地址:https://www.cnblogs.com/DMoon/p/4915604.html
Copyright © 2011-2022 走看看