rt.代码如下
#include<cstdio>
#include<algorithm>
using namespace std;
int map[10][10],ans=-1,tot,begin_gets,row[10],col[10],squ[10],vec[10][10][10],tot_[10][10];
struct node{int x,y,pos;}a[90];
int score[10][10]=
{{0,0,0,0,0,0,0,0,0,0},
{0,6,6,6,6,6,6,6,6,6},
{0,6,7,7,7,7,7,7,7,6},
{0,6,7,8,8,8,8,8,7,6},
{0,6,7,8,9,9,9,8,7,6},
{0,6,7,8,9,10,9,8,7,6},
{0,6,7,8,9,9,9,8,7,6},
{0,6,7,8,8,8,8,8,7,6},
{0,6,7,7,7,7,7,7,7,6},
{0,6,6,6,6,6,6,6,6,6}};
inline int read(){
char c=getchar();int f=0,s=1;
while(c<'0'||c>'9'){if(c=='-') s=-1;c=getchar();}
while(c>='0'&&c<='9'){f=f*10+c-48;c=getchar();}
return f*s;
}
inline void print(int x){
if(x<0) putchar('-'),x=-x;
if(x>9) print(x/10);
putchar(x%10+'0');
}
inline int getsqu(int x,int y){return (x-1)/3*3+(y-1)/3+1;}
inline bool cmp(node a,node b){return a.pos<b.pos;}
inline void dfs(int x,int y,int gets,int step){
if(step>tot){
if(gets>ans) ans=gets;
return;
}
for(int i=1;i<=tot_[x][y];i++){
int k=vec[x][y][i];
if(((row[x])&(1<<k))||((col[y])&(1<<k))||((squ[getsqu(x,y)])&(1<<k))) continue;
map[x][y]=k;
row[x]+=(1<<k),col[y]+=(1<<k),squ[getsqu(x,y)]+=(1<<k);
dfs(a[step+1].x,a[step+1].y,gets+map[x][y]*score[x][y],step+1);
row[x]-=(1<<k),col[y]-=(1<<k),squ[getsqu(x,y)]-=(1<<k);
map[x][y]=0;
}
}
int main(){
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++){
map[i][j]=read();
if(map[i][j]==0) continue;
int k=(1<<map[i][j]);
row[i]+=k,col[j]+=k,squ[getsqu(i,j)]+=k;
}
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++){
if(map[i][j]==0){
a[++tot]={i,j,0};
for(int k=1;k<=9;k++)
if(row[i]&(1<<k)||col[j]&(1<<k)||squ[getsqu(i,j)]&(1<<k)) continue;
else a[tot].pos++,vec[i][j][++tot_[i][j]]=k;
}else begin_gets+=map[i][j]*score[i][j];
}
sort(a+1,a+tot+1,cmp);
dfs(a[1].x,a[1].y,begin_gets,1);
print(ans);
return 0;
}