#include<algorithm>
#include<cstdio>
using namespace std;
struct node{
int num,x;
}a[10];
int sudoku[10][10],Search[82][4];
int Answer=-1,Count;
bool f1[10][10],f2[10][10],f3[10][10];
bool cmp(node a,node b){
return a.num<b.num;
}int palace(int x,int y){
if(x>=1&&x<=3&&y>=1&&y<=3)
return 1;
else if(x>=1&&x<=3&&y>=4&&y<=6)
return 2;
else if(x>=1&&x<=3&&y>=7&&y<=9)
return 3;
else if(x>=4&&x<=6&&y>=1&&y<=3)
return 4;
else if(x>=4&&x<=6&&y>=4&&y<=6)
return 5;
else if(x>=4&&x<=6&&y>=7&&y<=9)
return 6;
else if(x>=7&&x<=9&&y>=1&&y<=3)
return 7;
else if(x>=7&&x<=9&&y>=4&&y<=6)
return 8;
else
return 9;
}int score(int x,int y){
if(x==1||y==1||x==9||y==9)
return 6;
else if(x==2||y==2||x==8||y==8)
return 7;
else if(x==3||y==3||x==7||y==7)
return 8;
else if(x==4||y==4||x==6||y==6)
return 9;
else
return 10;
}void dfs(int dep,int Total){
if(dep==Count+1){
if(Total>Answer)
Answer=Total;
return;
}for(int x=1;x<=9;x++)
if(f1[Search[dep][1]][x]==false&&f2[Search[dep][2]][x]==false&&f3[Search[dep][3]][x]==false){
f1[Search[dep][1]][x]=f2[Search[dep][2]][x]=f3[Search[dep][3]][x]=true;
dfs(dep+1,Total+(Search[dep][0]*x));
f1[Search[dep][1]][x]=f2[Search[dep][2]][x]=f3[Search[dep][3]][x]=false;
}
}int main(){
int Total=0;
for(int i=1;i<=9;i++){
a[i].x=i;
for(int j=1;j<=9;j++){
scanf("%d",&sudoku[i][j]);
if(sudoku[i][j]){
f1[i][sudoku[i][j]]=f2[j][sudoku[i][j]]=f3[palace(i,j)][sudoku[i][j]]=true;
Total+=sudoku[i][j]*score(i,j);
}else
a[i].num++;
}
}sort(a+1,a+10,cmp);
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++)
if(sudoku[a[i].x][j]==0){
Search[++Count][0]=score(i,j);
Search[Count][1]=a[i].x;
Search[Count][2]=j;
Search[Count][3]=palace(i,j);
}
}dfs(1,Total);
printf("%d",Answer);
return 0;
}
(悬关)