状态:
Accepted
测评机:
Xeond[6]
得分:
100分 [我要评价一下题目~]
提交日期:
2013-5-11 14:31:00
有效耗时:
5250毫秒
测试结果1:
通过本测试点|有效耗时47ms
测试结果2:
通过本测试点|有效耗时62ms
测试结果3:
通过本测试点|有效耗时63ms
测试结果4:
通过本测试点|有效耗时62ms
测试结果5:
通过本测试点|有效耗时63ms
测试结果6:
通过本测试点|有效耗时47ms
测试结果7:
通过本测试点|有效耗时47ms
测试结果8:
通过本测试点|有效耗时78ms
测试结果9:
通过本测试点|有效耗时93ms
测试结果10:
通过本测试点|有效耗时63ms
测试结果11:
通过本测试点|有效耗时297ms
测试结果12:
通过本测试点|有效耗时47ms
测试结果13:
通过本测试点|有效耗时140ms
测试结果14:
通过本测试点|有效耗时391ms
测试结果15:
通过本测试点|有效耗时203ms
测试结果16:
通过本测试点|有效耗时438ms
测试结果17:
通过本测试点|有效耗时1250ms
测试结果18:
通过本测试点|有效耗时468ms
测试结果19:
通过本测试点|有效耗时313ms
测试结果20:
通过本测试点|有效耗时1078ms
#include<stdio.h>
#include<math.h>
#include<string.h>
int a[10][10],h[10],hs[10],ss[10],nine[10],sort[10],q[10];
int 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 f(){
int c=a[5][5]*10;
for(int k=2;k<=5;k++){
for(int i=k;i<=10-k;i++)
c+=(4+k)*(a[i][k-1]+a[i][11-k]);
for(int j=k;j<=10-k;j++)
c+=(4+k)*(a[k-1][j]+a[11-k][j]);
c+=(4+k)*(a[k-1][k-1]+a[k-1][11-k]+a[11-k][k-1]+a[11-k][11-k]);
}
if(c>ans)ans=c;
}
void dfs(int k){
if(k==10)f();
else {
int i=sort[k],j,get,num,pos,p;
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;
}
}
int main(){
int k=1;
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++){
sort[i]=i;
scanf("%d",&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)
{printf("-1\n");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(int i=1;i<9;i++)
for(int j=i+1;j<=9;j++)
if(q[sort[i]]>q[sort[j]])swap(&sort[i],&sort[j]);
while(q[sort[k]]==0)k++;dfs(k);
printf("%d\n",ans);
return 0;
}