rt.这里是代码。
#include <bits/stdc++.h>
using namespace std;
const int maxn=15;
int a[maxn][maxn],tot,ans,now,line[maxn][maxn],col[maxn][maxn],block[maxn][maxn];
struct node{
int x,y,num,bel;//坐标,分值,属于的宫
}p[maxn];
struct options{
int idx,cnt;//行下标, 待填的数量
bool operator<(const options &o)const{
return cnt<o.cnt;
}
}opt[maxn];
inline int belong(int x,int y)//属于的宫
{
if(x<=3)
{
if(y<=3)return 1;
if(y<=6)return 2;
if(y<=9)return 3;
}
if(x<=6)
{
if(y<=3)return 4;
if(y<=6)return 5;
if(y<=9)return 6;
}
if(x<=9)
{
if(y<=3)return 7;
if(y<=6)return 8;
if(y<=9)return 9;
}
}
inline int score(int x,int y)
{
if(x==1 || x==9 || y==1 || y==9)return 6;
if(x==2 || x==8 || y==2 || y==8)return 7;
if(x==3 || x==7 || y==3 || y==7)return 8;
if(x==4 || x==6 || y==4 || y==6)return 9;
return 10;
}
inline void dfs(int n,int sum)
{
if(n==tot+1)//合法填完了所有的数
{
ans=max(ans,sum);
return;
}
for(int i=1;i<=9;i++)
{
if(!line[p[n].x][i] && !col[p[n].y][i] && !block[p[n].bel][i])//判断可不可以将i填入
{
line[p[n].x][i]=col[p[n].y][i]=block[p[n].bel][i]=1;
dfs(n+1,sum+(p[n].num*i));
line[p[n].x][i]=col[p[n].y][i]=block[p[n].bel][i]=0;
}
}
return;
}
int main()
{
for(int i=1;i<=9;i++)opt[i].idx=i;
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
scanf("%d",&a[i][j]);
if(a[i][j]>0)
{
now+=(a[i][j]*score(i,j));//已填
line[i][a[i][j]]=col[j][a[i][j]]=block[belong(i,j)][a[i][j]]=1;//标记
}
else opt[i].cnt++;
}
}
sort(opt+1,opt+9+1);
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
if(a[opt[i].idx][j]==0)
{
p[tot++].x=opt[i].idx;
p[tot].y=j;
p[tot].bel=belong(opt[i].idx,j);
p[tot].num=score(opt[i].idx,j);
}
}
}
dfs(1,now);
printf("%d\n",ans);
return 0;
}