记录编号 126986 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2009]靶形数独 最终得分 100
用户昵称 Gravatar席一鸣 是否通过 通过
代码语言 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;
}