• [NOIP2009] 靶形数独


      1 #include<cstdio>
      2 #include<cstring>
      3 #include<cstdlib>
      4 #include<iostream>
      5 #define sh short
      6 #define mem(a,b) memset(a,b,sizeof(a))
      7 using namespace std;
      8 inline int maxn(int a,int b){return a>b?a:b;}
      9 
     10 /*struct son
     11 {
     12     int x,y;
     13     son(int qq=0,int ww=0)
     14     {
     15         x=qq;y=ww;
     16     }
     17 };
     18 son ji[206];*/
     19 //int num;
     20 int a[11][11];
     21 bool heng[11][11],zong[11][11];
     22 int dui[11][11];
     23 int pos[11][11],judge[11][11];
     24 
     25 int ans,sco;
     26 
     27 void dfs(sh x,sh y)
     28 {
     29     if(y==10)
     30       y=1,++x;
     31     if(x==10)
     32     {
     33         ans=maxn(ans,sco);
     34         return ;
     35     }
     36     if(a[x][y])
     37     {
     38         dfs(x,y+1);
     39         return ;
     40     }
     41     
     42     for(sh i=9;i>=1;--i)
     43     {
     44         if(heng[x][i]||zong[y][i]||judge[pos[x][y]][i])continue;
     45         heng[x][i]=1;
     46         zong[y][i]=1;
     47         judge[pos[x][y]][i]=1;
     48         //a[x][y]=i;
     49         
     50         sco+=i*dui[x][y];
     51         dfs(x,y+1);
     52         heng[x][i]=0;
     53         zong[y][i]=0;
     54         judge[pos[x][y]][i]=0;
     55         //a[x][y]=0;
     56         sco-=i*dui[x][y];
     57     }
     58 }
     59 
     60 int main(){
     61     //freopen("1.txt","r",stdin);
     62     //freopen("2.txt","w",stdout);
     63     //freopen("sudoku.in","r",stdin);
     64     //freopen("sudoku.out","w",stdout);
     65     for(int i=1;i<=9;++i)
     66       for(int j=1;j<=9;++j)
     67       {
     68         scanf("%d",&a[i][j]);
     69         /*if(!a[i][j])continue;
     70         if(heng[i][a[i][j]]||zong[j][a[i][j]])
     71         {
     72                 printf("-1");
     73                 return 0;
     74             }*/
     75         heng[i][a[i][j]]=1;
     76         zong[j][a[i][j]]=1;
     77         }
     78     
     79     for(int j=1;j<=9;++j)
     80         dui[1][j]=dui[9][j]=6;
     81     for(int i=2;i<=8;++i)
     82       dui[i][1]=dui[i][9]=6;
     83     for(int j=2;j<=8;++j)
     84         dui[2][j]=dui[8][j]=7;
     85     for(int i=3;i<=7;++i)
     86         dui[i][2]=dui[i][8]=7;
     87     for(int j=3;j<=7;++j)
     88         dui[3][j]=dui[7][j]=8;
     89     for(int i=4;i<=6;++i)
     90         dui[i][3]=dui[i][7]=8;
     91     for(int j=4;j<=6;++j)
     92         dui[4][j]=dui[6][j]=9;
     93     for(int i=5;i<=5;++i)
     94         dui[i][4]=dui[i][6]=9;
     95     dui[5][5]=10;
     96     
     97     for(int i=1;i<=9;++i)
     98       for(int j=1;j<=9;++j)
     99         sco+=dui[i][j]*a[i][j];
    100     
    101     /*for(int i=1;i<=9;++i)
    102       for(int j=1;j<=9;++j)
    103         if(dui[i][j]==10&&a[i][j]==0)
    104           ji[++num]=son(i,j);
    105     for(int i=1;i<=9;++i)
    106       for(int j=1;j<=9;++j)
    107         if(dui[i][j]==9&&a[i][j]==0)
    108           ji[++num]=son(i,j);
    109     for(int i=1;i<=9;++i)
    110       for(int j=1;j<=9;++j)
    111         if(dui[i][j]==8&&a[i][j]==0)
    112           ji[++num]=son(i,j);
    113     for(int i=1;i<=9;++i)
    114       for(int j=1;j<=9;++j)
    115         if(dui[i][j]==7&&a[i][j]==0)
    116           ji[++num]=son(i,j);
    117     for(int i=1;i<=9;++i)
    118       for(int j=1;j<=9;++j)
    119         if(dui[i][j]==6&&a[i][j]==0)
    120           ji[++num]=son(i,j);*/
    121     /*printf("
    ");
    122     for(int i=1;i<=9;++i)
    123     {
    124         for(int j=1;j<=9;++j)
    125           printf("%d ",dui[i][j]);
    126         printf("
    ");
    127     }
    128     printf("
    ");
    129     
    130     printf("sco=%d
    ",sco);*/
    131     
    132     for(int i=1;i<=3;++i)
    133       for(int j=1;j<=3;++j)
    134         pos[i][j]=1;
    135     for(int i=1;i<=3;++i)
    136       for(int j=4;j<=6;++j)
    137         pos[i][j]=2;
    138     for(int i=1;i<=3;++i)
    139       for(int j=7;j<=9;++j)
    140         pos[i][j]=3;
    141     for(int i=4;i<=6;++i)
    142       for(int j=1;j<=3;++j)
    143         pos[i][j]=4;
    144     for(int i=4;i<=6;++i)
    145       for(int j=4;j<=6;++j)
    146         pos[i][j]=5;
    147     for(int i=4;i<=6;++i)
    148       for(int j=7;j<=9;++j)
    149         pos[i][j]=6;
    150     for(int i=7;i<=9;++i)
    151       for(int j=1;j<=3;++j)
    152         pos[i][j]=7;
    153     for(int i=7;i<=9;++i)
    154       for(int j=4;j<=6;++j)
    155         pos[i][j]=8;
    156     for(int i=7;i<=9;++i)
    157       for(int j=7;j<=9;++j)
    158         pos[i][j]=9;
    159     
    160     for(int i=1;i<=9;++i)
    161       for(int j=1;j<=9;++j)
    162         judge[pos[i][j]][a[i][j]]=1;
    163     
    164     ans=-1;
    165     dfs(1,1);
    166     
    167     cout<<ans;
    168     
    169     while(1);
    170     return 0;
    171 }
    纯爆搜
  • 相关阅读:
    JS替换字符串多余的空格符
    WebStorm2017.3.4版本 注册码
    使用$.getJSON()需要注意的地方
    45道CSS基础面试题(附答案)
    单机版搭建Hadoop环境图文教程详解
    Ubuntu下安装JDK图文详解
    VMtools安装以及设置
    Ubuntu 12.04中文输入法的安装
    Hadoop 学习之 FAQ
    java ant 命令大全
  • 原文地址:https://www.cnblogs.com/A-LEAF/p/7323229.html
Copyright © 2020-2023  润新知