首页 > 代码库 > [NOIP2009] 靶形数独

[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("\n");
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("\n");
127     }
128     printf("\n");
129     
130     printf("sco=%d\n",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 }
纯爆搜

 

[NOIP2009] 靶形数独