记录编号 600151 评测结果 AAAAAAAATAAAAAAATTTT
题目名称 [NOIP 2009]靶形数独 最终得分 75
用户昵称 GravatarChenBp 是否通过 未通过
代码语言 C++ 运行时间 12.242 s
提交时间 2025-04-17 06:28:17 内存使用 3.36 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define ll long long
using namespace std;
inline int read() {
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
		x=x*10+ch-'0',ch=getchar();
	return x*f;
}
void write(int x) {
	if(x<0)
		putchar('-'),x=-x;
	if(x>9)
		write(x/10);
	putchar(x%10+'0');
	return;
}
constexpr int f[9][9]={
	{6,6,6,6,6, 6,6,6,6},
	{6,7,7,7,7, 7,7,7,6},
	{6,7,8,8,8, 8,8,7,6},
	{6,7,8,9,9, 9,8,7,6},
	{6,7,8,9,10,9,8,7,6},
	{6,7,8,9,9, 9,8,7,6},
	{6,7,8,8,8, 8,8,7,6},
	{6,7,7,7,7, 7,7,7,6},
	{6,6,6,6,6, 6,6,6,6}
};
int g[9][9];
int h[9],l[9],gr[3][3];
int num=0;
struct node {
	short x,y,sum=0,w;
} s[100];
bool cmp(node x,node y) {
	return x.sum<y.sum;
}
int lowbit(int x) {
	return x&(-x);
}
ll ans=-1;
void dfs(ll t) {
	if(t==num+1) {
		ll now=0;
		for(int i=0; i<9; i++) {
			for(int j=0; j<9; j++) {
				now+=f[i][j]*g[i][j];
			}
		}
		ans=max(ans,now);
		return;
	}
	int w=s[t].w;
	int x=s[t].x,y=s[t].y;
	while(w) {
		int k=log2(lowbit(w));
		if((((h[x]>>k)&1)+((l[y]>>k)&1)+((gr[x/3][y/3]>>k)&1))==0) {
			h[x]|=1<<k;
			l[y]|=1<<k;
			gr[x/3][y/3]|=1<<k;
			g[x][y]=k;
			dfs(t+1);
			g[x][y]=0;
			h[x]&=(~(1<<k));
			l[y]&=(~(1<<k));
			gr[x/3][y/3]&=(~(1<<k));
		}
		w-=lowbit(w);
	}
}
int main() {
	for(int i=0; i<9; i++) {
		for(int j=0; j<9; j++) {
			g[i][j]=read();
			if(g[i][j]==0) continue;
			h[i]|=1<<g[i][j];
			l[j]|=1<<g[i][j];
			gr[i/3][j/3]|=1<<g[i][j];
		}
	}

//    for(int i=0;i<9;i++){while(h[i]){cout<<log2(bitset(h[i]))<<" ";h[i]-=bitset(h[i]);}cout<<endl;}
//    for(int i=0;i<9;i++){while(l[i]){cout<<log2(bitset(l[i]))<<" ";l[i]-=bitset(l[i]);}cout<<endl;}
//    for(int i=0;i<3;i++){for(int j=0;j<3;j++){while(gr[i][j]){cout<<log2(bitset(gr[i][j]))<<" ";gr[i][j]-=bitset(gr[i][j]);}cout<<endl;}}

	for(int i=0; i<9; i++) {
		for(int j=0; j<9; j++) {
			if(g[i][j]!=0) continue;
			num++;
			s[num].x=i;
			s[num].y=j;
			for(int k=1; k<=9; k++) {
				if((((h[i]>>k)&1)+((l[j]>>k)&1)+((gr[i/3][j/3]>>k)&1))==0) {
					s[num].sum++;
					s[num].w|=1<<k;
				}
			}
		}
	}
	sort(s+1,s+1+num,cmp);
//    for(int i=1;i<=num;i++){cout<<s[i].x<<" "<<s[i].y<<" "<<s[i].sum<<"\n";
	dfs(1);
	write(ans);
	return 0;
}