记录编号 462617 评测结果 AAAAAAAAATATAATTAAAA
题目名称 [NOIP 2009]靶形数独 最终得分 80
用户昵称 Gravatar하루Kiev 是否通过 未通过
代码语言 C++ 运行时间 9.639 s
提交时间 2017-10-22 19:17:00 内存使用 0.29 MiB
显示代码纯文本
#include <stdio.h>
#include <algorithm>
#include <cmath>
using namespace std;
int sco[10][10],map[10][10],bl[10][10],sum;
bool h[10][10],l[10][10],g[10][10];
void matrix_init(){
	 for(int i=1;i<=9;i++) sco[1][i]=sco[i][1]=sco[9][i]=sco[i][9]=6;
	 for(int i=2;i<=8;i++) sco[2][i]=sco[i][2]=sco[i][8]=sco[8][i]=7;
	 for(int i=3;i<=7;i++) sco[3][i]=sco[i][3]=sco[i][7]=sco[7][i]=8;
	 for(int i=4;i<=6;i++) sco[4][i]=sco[i][4]=sco[i][6]=sco[6][i]=9;
	 sco[5][5]=10;
	 for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) bl[i][j]=1;
	 for(int i=1;i<=3;i++) for(int j=4;j<=6;j++) bl[i][j]=2;
	 for(int i=1;i<=3;i++) for(int j=7;j<=9;j++) bl[i][j]=3;
	 for(int i=4;i<=6;i++) for(int j=1;j<=3;j++) bl[i][j]=4;
	 for(int i=4;i<=6;i++) for(int j=4;j<=6;j++) bl[i][j]=5;
	 for(int i=4;i<=6;i++) for(int j=7;j<=9;j++) bl[i][j]=6;
	 for(int i=7;i<=9;i++) for(int j=1;j<=3;j++) bl[i][j]=7;
	 for(int i=7;i<=9;i++) for(int j=4;j<=6;j++) bl[i][j]=8;
	 for(int i=7;i<=9;i++) for(int j=7;j<=9;j++) bl[i][j]=9;
	 for(int i=1;i<=9;i++) for(int j=1;j<=9;j++){
	     scanf("%d",&map[i][j]);if(map[i][j]!=0){
		 h[i][map[i][j]]=1; l[j][map[i][j]]=1; g[bl[i][j]][map[i][j]]=1;}}
}	 
void check(){
	 int ans=0;
	 for(int i=1;i<=9;i++)
	     for(int j=1;j<=9;j++)
	         ans+=map[i][j]*sco[i][j];
	 sum=max(sum,ans);
}
void dfs(int x,int y){
	 if(x==10){check();return ;}
	 if(map[x][y]){if(y!=1) dfs(x,y-1);else dfs(x+1,9);return;}
	 for(int i=1;i<=9;i++)
	     if(!g[bl[x][y]][i]&&!h[x][i]&&!l[y][i]){
	        g[bl[x][y]][i]=h[x][i]=l[y][i]=1;map[x][y]=i;
	        if(y!=1) dfs(x,y-1);else dfs(x+1,9);
	        g[bl[x][y]][i]=h[x][i]=l[y][i]=0;map[x][y]=0;
		 }
}
int main(){
	freopen("sudoku.in","r",stdin);
	freopen("sudoku.out","w",stdout);
	matrix_init();
	dfs(1,9);
	if(sum==0) puts("-1");
	else printf("%d",sum);
}
/*
1 0 0 0 5 0 0 9 3
0 0 0 9 1 2 0 0 0
0 0 0 6 0 4 0 0 0
8 6 0 0 0 0 0 0 0
0 0 0 0 6 0 0 0 7
0 0 0 0 0 0 0 0 0
0 0 0 0 4 0 7 0 2
4 2 0 3 8 0 0 0 9
0 0 0 0 0 9 0 3 4
*/