讨论 / 终于过了,把程序贴上来
后皇嘉树 2013-05-10 23:50:00
点我顶贴 收藏 删除
题目:[NOIP09]靶形数独

状态:

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;

}

查看更多回复
提交回复