#include int scoreMat[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 a[9][9],scoreTable[9][9][10]; int maxScore=-1; bool row[9][10],col[9][10],squ[3][3][10]; #define canPlace(n,x,y) (!(row[(x)][(n)]||col[(y)][(n)]||squ[(x)/3][(y)/3][(n)])) #define place(n,x,y) a[(x)][(y)]=(n),row[(x)][(n)]=col[(y)][(n)]=squ[(x)/3][(y)/3][(n)]=true; #define unplace(n,x,y) a[(x)][(y)]=0,row[(x)][(n)]=col[(y)][(n)]=squ[(x)/3][(y)/3][(n)]=false; void dfs(int pos) { if(pos>=81) { int score=0; for(int i=0; i<9; i++) for(int j=0; j<9; j++) score+=scoreTable[i][j][a[i][j]]; if(score>maxScore) maxScore=score; } else { int x=pos/9,y=pos%9; if(a[x][y]) dfs(pos+1); else for(int i=1; i<=9; i++) if(canPlace(i,x,y)) { place(i,x,y); dfs(pos+1); unplace(i,x,y); } } } int main() { for(int i=0; i<9; i++) for(int j=0; j<9; j++) for(int k=1; k<=9; k++) scoreTable[i][j][k]=scoreMat[i][j]*k; for(int i=8; i>=0; i--) for(int j=8; j>=0; j--) scanf("%d",&a[i][j]); for(int i=0; i<9; i++) for(int j=0; j<9; j++) if(a[i][j]) place(a[i][j],i,j); dfs(0); printf("%d",maxScore); return 0; }