记录编号 |
434873 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOIP 2009]靶形数独 |
最终得分 |
100 |
用户昵称 |
Anonymity |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
3.594 s |
提交时间 |
2017-08-08 20:40:39 |
内存使用 |
0.31 MiB |
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#define maxn 11
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
inline int read()
{ char c=getchar();int x=0,y=1;
while(c<'0'||c>'9'){if(c=='-') y=-1;c=getchar();}
while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
return x*y;
}
int fans,ans,w[maxn][maxn],A[maxn][maxn];
bool ok[maxn][maxn],ok2[maxn][maxn],ok3[5][5][11];
inline bool check(int x,int y,int z)
{ if(ok[x][z]) return 0;
if(ok2[y][z]) return 0;
int t1=(x-1)/3+1,t2=(y-1)/3+1;
if(ok3[t1][t2][z]) return 0;
return 1;
}
inline int ab(int x){return (x-5>0)?x-5:5-x;}
void dfs()
{
int smax=10,x=0,y=0;
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
if(!A[i][j])
{ int tmp=0;
for(int k=1;k<=9;k++)
if(check(i,j,k))
++tmp;
if(tmp<smax) smax=tmp,x=i,y=j;
}
if(smax==10)
{ ans=0;
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
ans+=w[i][j]*A[i][j];
fans=max(ans,fans);
}
for(int i=1;i<=9;i++)
if(x&&y&&check(x,y,i))
{ int t1=(x-1)/3+1,t2=(y-1)/3+1,tmp=0;
ok[x][i]=1;ok2[y][i]=1;ok3[t1][t2][i]=1;A[x][y]=i;
dfs();
ok[x][i]=0;ok2[y][i]=0;ok3[t1][t2][i]=0;A[x][y]=0;
}
}
int main()
{ freopen("sudoku.in","r",stdin);
freopen("sudoku.out","w",stdout);
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
{ A[i][j]=read();
if(A[i][j])
{ ok[i][A[i][j]]=1;ok2[j][A[i][j]]=1;
int t1=(i-1)/3+1,t2=(j-1)/3+1;
ok3[t1][t2][A[i][j]]=1;
}
}
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
{ int t1=ab(i),t2=ab(j);
if(t1==4) w[i][j]=6;
if(t1==3){if(t2==4) w[i][j]=6;else w[i][j]=7;}
if(t1==2){if(t2==4) w[i][j]=6;else if(t2==3) w[i][j]=7;else w[i][j]=8;}
if(t1==1){if(t2==4) w[i][j]=6;else if(t2==3) w[i][j]=7;else if(t2==2) w[i][j]=8;else w[i][j]=9;}
if(t1==0){if(t2==4) w[i][j]=6;else if(t2==3) w[i][j]=7;else if(t2==2) w[i][j]=8;else if(t2==1) w[i][j]=9;else w[i][j]=10;}
}
dfs();
if(!fans) printf("-1");
else printf("%d",fans);
return 0;
}