记录编号 459354 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOIP 2009]靶形数独 最终得分 100
用户昵称 Gravatarzeppoe 是否通过 通过
代码语言 C++ 运行时间 3.701 s
提交时间 2017-10-12 21:57:53 内存使用 0.29 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
using namespace std;
int n,ans,rank[6],map[10][10];
bool r[10][10],l[10][10],p[10][10];
//手动笑哭,数组是从第零位开始存的,noip很玄啊。。。 
int g[10][10]={
	0,0,0,0,0,0,0,0,0,0,
	0,1,1,1,2,2,2,3,3,3,
	0,1,1,1,2,2,2,3,3,3,
	0,1,1,1,2,2,2,3,3,3,
	0,4,4,4,5,5,5,6,6,6,
	0,4,4,4,5,5,5,6,6,6,
    0,4,4,4,5,5,5,6,6,6,
	0,7,7,7,8,8,8,9,9,9,
	0,7,7,7,8,8,8,9,9,9,
	0,7,7,7,8,8,8,9,9,9
};

int ra[10][10]={
	0,0,0,0,0,0,0,0,0,0,
	0,1,1,1,1,1,1,1,1,1,
	0,1,2,2,2,2,2,2,2,1,
	0,1,2,3,3,3,3,3,2,1,
	0,1,2,3,4,4,4,3,2,1,
	0,1,2,3,4,5,4,3,2,1,
	0,1,2,3,4,4,4,3,2,1,
	0,1,2,3,3,3,3,3,2,1,
	0,1,2,2,2,2,2,2,2,1,
	0,1,1,1,1,1,1,1,1,1
};

int val;

int mod[100],div[100];

void dfs(int k){
	if(k>81) return void(val>ans?ans=val:0);
	//if(x) 即x不为0,0 false 1 true 手动笑哭 
	int x,y;
	if (mod[k]) x=mod[k],y=div[k]+1;else x=9,y=div[k];
	//从左上角开始搜,先行后列
	if(map[x][y]) return dfs(k+1);
	bool *R=r[x],*L=l[y],*P=p[g[x][y]];
	int i,RA=ra[x][y];
	i=1;
	if((!R[i])&&(!L[i])&&(!P[i])){
		R[i]=L[i]=P[i]=1;
		val+=RA*i;
		dfs(k+1);
		R[i]=L[i]=P[i]=0;
		val-=RA*i;
	}
	i=2;
	if((!R[i])&&(!L[i])&&(!P[i])){
		R[i]=L[i]=P[i]=1;
		val+=RA*i;
		dfs(k+1);
		R[i]=L[i]=P[i]=0;
		val-=RA*i;
	}
	i=3;
	if((!R[i])&&(!L[i])&&(!P[i])){
		R[i]=L[i]=P[i]=1;
		val+=RA*i;
		dfs(k+1);
		R[i]=L[i]=P[i]=0;
		val-=RA*i;
	}
	i=4;
	if((!R[i])&&(!L[i])&&(!P[i])){
		R[i]=L[i]=P[i]=1;
		val+=RA*i;
		dfs(k+1);
		R[i]=L[i]=P[i]=0;
		val-=RA*i;
	}
	i=5;
	if((!R[i])&&(!L[i])&&(!P[i])){
		R[i]=L[i]=P[i]=1;
		val+=RA*i;
		dfs(k+1);
		R[i]=L[i]=P[i]=0;
		val-=RA*i;
	}
	i=6;
	if((!R[i])&&(!L[i])&&(!P[i])){
		R[i]=L[i]=P[i]=1;
		val+=RA*i;
		dfs(k+1);
		R[i]=L[i]=P[i]=0;
		val-=RA*i;
	}
	i=7;
	if((!R[i])&&(!L[i])&&(!P[i])){
		R[i]=L[i]=P[i]=1;
		val+=RA*i;
		dfs(k+1);
		R[i]=L[i]=P[i]=0;
		val-=RA*i;
	}
	i=8;
	if((!R[i])&&(!L[i])&&(!P[i])){
		R[i]=L[i]=P[i]=1;
		val+=RA*i;
		dfs(k+1);
		R[i]=L[i]=P[i]=0;
		val-=RA*i;
	}
	i=9;
	if((!R[i])&&(!L[i])&&(!P[i])){
		R[i]=L[i]=P[i]=1;
		val+=RA*i;
		dfs(k+1);
		R[i]=L[i]=P[i]=0;
		val-=RA*i;
	}
}
int main(){
	freopen("sudoku.in","r",stdin);
	freopen("sudoku.out","w",stdout); 
	for (int i=0;i<=81;i++) mod[i]=i%9,div[i]=i/9;
	for (int i=1;i<=9;i++)
	for (int j=1;j<=9;j++)
		ra[i][j]+=5;
	for(int i=1;i<=9;i++)
	for(int j=1;j<=9;j++){
		scanf("%d",&n);
		if(n){
			r[i][n]=1;
			l[j][n]=1;
			p[g[i][j]][n]=1;
			val+=ra[i][j]*n;
		}
		map[i][j]=n;
	}
	dfs(1);
	if(!ans) printf("-1");else printf("%d",ans);
	return 0;
}