记录编号 |
126986 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
[NOIP 2009]靶形数独 |
最终得分 |
100 |
用户昵称 |
席一鸣 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
2.404 s |
提交时间 |
2014-10-14 19:45:15 |
内存使用 |
0.31 MiB |
显示代码纯文本
#include<cmath>
#include<cstdio>
#include<iostream>
using namespace std;
int a[10][10],h[10],hs[10],ss[10],nine[10],sort[10],q[10],ans=-1,st=511;
void swap(int*a,int*b)
{
*a^=*b;
*b^=*a;
*a^=*b;
}
int ten(int x)
{
return(int)log2(x)+1;
}
void dfs(int k)
{
int c,i,j,l,get,num,pos,p;
if(k==10)
{
c=a[5][5]*10;
for(l=2;l<=5;l++)
{
for(i=l;i<=10-l;i++)
c+=(4+l)*(a[i][l-1]+a[i][11-l]);
for(j=l;j<=10-l;j++)
c+=(4+l)*(a[l-1][j]+a[11-l][j]);
c+=(4+l)*(a[l-1][l-1]+a[l-1][11-l]+a[11-l][l-1]+a[11-l][11-l]);
}
ans=max(ans,c);
}
else
{
i=sort[k];
pos=st&~h[i];
p=pos&-pos;
h[i]|=p;
j=ten(p);
get=st&~(hs[i]|ss[j]|nine[(i-1)/3*3+(j-1)/3+1]);
while(get)
{
num=get&-get;
get^=num;
a[i][j]=ten(num);
hs[i]|=num;
ss[j]|=num;
nine[(i-1)/3*3+(j-1)/3+1]|=num;
if(pos==p)
dfs(k+1);
else
dfs(k);
hs[i]^=num;
ss[j]^=num;
nine[(i-1)/3*3+(j-1)/3+1]^=num;
}
h[i]^=p;
}
}
main()
{
freopen("sudoku.in","r",stdin);
freopen("sudoku.out","w",stdout);
int i,j,k=1;
for(i=1;i<=9;i++)
for(j=1;j<=9;j++)
{
sort[i]=i;
cin>>a[i][j];
if(a[i][j])
{
h[i]|=1<<(j-1);
if(((hs[i]|ss[j]|nine[(i-1)/3*3+(j-1)/3+1])&(1<<(a[i][j]-1)))==1)
{
cout<<-1;
return 0;
}
hs[i]|=1<<(a[i][j]-1);
ss[j]|=1<<(a[i][j]-1);
nine[(i-1)/3*3+(j-1)/3+1]|=1<<(a[i][j]-1);
}
else
q[i]++;
}
for(i=1;i<9;i++)
for(j=i+1;j<=9;j++)
if(q[sort[i]]>q[sort[j]])
swap(&sort[i],&sort[j]);
while(!q[sort[k]])
k++;
dfs(k);
cout<<ans;
}