You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
59 lines
1.6 KiB
C++
59 lines
1.6 KiB
C++
#include <cstdio>
|
|
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;
|
|
}
|