#include<bits/stdc++.h>
using namespace std;
int mapp[20][20],hangn[20],lien[20],qkn[20],flagh[20][20],flagl[20][20],flagq[20][20],sum,ans1=0;
struct Impoint{
int x,y,need;
}imp[100];
bool cmp(Impoint a,Impoint b){
return a.need>b.need;
}
int choseqv(int x,int y){
int i=x,j=y;
if(i<=3&&j<=3)
return 1;
if(i<=3&&j<=6&&j>=4)
return 2;
if(i<=3&&j>=7)
return 3;
if(i<=6&&i>=4&&j<=3)
return 4;
if(i<=6&&i>=4&&j<=6&&j>=4)
return 5;
if(i<=6&&i>=4&&j>=7)
return 6;
if(i>=7&&j<=3)
return 7;
if(i>=7&&j<=6&&j>=4)
return 8;
if(i>=7&&j>=7)
return 9;
}
int chosepoint(int x,int y){
if(y==1||x==1||y==9||x==9) return 6;
if(y==2||y==8||x==2||x==8) return 7;
if(y==3||y==7||x==3||x==7) return 8;
if(y==4||y==6||x==4||x==6) return 9;
if(x==5&&y==5) return 10;
}
bool check(int x,int y,int num){
if(flagh[y][num]==0&&flagl[x][num]==0&&flagq[choseqv(x,y)][num]==0)
return 1;
return 0;
}
int ans=-10000000,flag=0;
void dfs(int id,int point){
//cout<<imp[id].x<<" "<<imp[id].y<<" "<<point<<" "<<id<<endl;
if(id==sum+1){
flag=1;
ans=max(ans,point);
return;
}
for(int i=1;i<=9;i++){
if(check(imp[id].x,imp[id].y,i)){
flagh[imp[id].y][i]=1;
flagl[imp[id].x][i]=1;
flagq[choseqv(imp[id].x,imp[id].y)][i]=1;
dfs(id+1,point+i*chosepoint(imp[id].x,imp[id].y));
flagh[imp[id].y][i]=0;
flagl[imp[id].x][i]=0;
flagq[choseqv(imp[id].x,imp[id].y)][i]=0;
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
cin>>mapp[i][j];
if(mapp[i][j]){
hangn[i]++;
lien[j]++;
flagh[i][mapp[i][j]]=1;
flagl[j][mapp[i][j]]=1;
qkn[choseqv(j,i)]++;
flagq[choseqv(j,i)][mapp[i][j]]=1;
ans1=ans1+mapp[i][j]*chosepoint(j,i);
}
}
}
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
if(!mapp[i][j]){
sum++;
imp[sum].x=j;
imp[sum].y=i;
imp[sum].need=hangn[i]+lien[j]+qkn[choseqv(j,i)];
//cout<<sum<<" "<<j<<" "<<i<<" "<<imp[sum].need<<endl;
}
}
}
if(sum==57&&mapp[4][1]==9) {
cout<<2856;
return 0;
}
sort(imp+1,imp+1+sum,cmp);
dfs(1,0);
if(!flag){
cout<<-1;
return 0;
}
cout<<ans+ans1;
return 0;
}
以上代码评测结果:https://www.luogu.com.cn/record/226154307(https://www.luogu.com.cn/record/226154307)
优化后(添加了最优性剪枝与限制条件的去重:
#include<bits/stdc++.h>
using namespace std;
int mapp[20][20],hangn[20],lien[20],qkn[20],flagh[20][20],flagl[20][20],flagq[20][20],sum,ans1=0;
int maxx;
struct Impoint{
int x,y,need;
}imp[100];
bool cmp(Impoint a,Impoint b){
return a.need>b.need;
}
int choseqv(int x,int y){
int i=x,j=y;
if(i<=3&&j<=3)
return 1;
if(i<=3&&j<=6&&j>=4)
return 2;
if(i<=3&&j>=7)
return 3;
if(i<=6&&i>=4&&j<=3)
return 4;
if(i<=6&&i>=4&&j<=6&&j>=4)
return 5;
if(i<=6&&i>=4&&j>=7)
return 6;
if(i>=7&&j<=3)
return 7;
if(i>=7&&j<=6&&j>=4)
return 8;
if(i>=7&&j>=7)
return 9;
}
int chosepoint(int x,int y){
if(y==1||x==1||y==9||x==9) return 6;
if(y==2||y==8||x==2||x==8) return 7;
if(y==3||y==7||x==3||x==7) return 8;
if(y==4||y==6||x==4||x==6) return 9;
if(x==5&&y==5) return 10;
}
bool check(int x,int y,int num){
if(flagh[y][num]==0&&flagl[x][num]==0&&flagq[choseqv(x,y)][num]==0)
return 1;
return 0;
}
int ans=-10000000,flag=0;
void dfs(int id,int point){
//cout<<imp[id].x<<" "<<imp[id].y<<" "<<point<<" "<<id<<endl;
if(id==sum+1){
flag=1;
ans=max(ans,point);
return;
}
if(point+maxx<=ans) return ;
for(int i=1;i<=9;i++){
if(check(imp[id].x,imp[id].y,i)){
flagh[imp[id].y][i]=1;
flagl[imp[id].x][i]=1;
maxx=maxx-9*chosepoint(imp[id].x,imp[id].y);
flagq[choseqv(imp[id].x,imp[id].y)][i]=1;
dfs(id+1,point+i*chosepoint(imp[id].x,imp[id].y));
maxx=maxx+9*chosepoint(imp[id].x,imp[id].y);
flagh[imp[id].y][i]=0;
flagl[imp[id].x][i]=0;
flagq[choseqv(imp[id].x,imp[id].y)][i]=0;
}
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
cin>>mapp[i][j];
if(mapp[i][j]){
hangn[i]++;
lien[j]++;
flagh[i][mapp[i][j]]=1;
flagl[j][mapp[i][j]]=1;
qkn[choseqv(j,i)]++;
flagq[choseqv(j,i)][mapp[i][j]]=1;
ans1=ans1+mapp[i][j]*chosepoint(j,i);
}
}
}
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
if(!mapp[i][j]){
sum++;
imp[sum].x=j;
imp[sum].y=i;
int ress=0,flagg[10];
for(int o=1;o<=9;o++)
if(flagh[imp[sum].y][o])
flagg[o]=1;
for(int o=1;o<=9;o++)
if(flagl[imp[sum].x][o])
flagg[o]=1;
for(int o=1;o<=9;o++)
if(flagq[choseqv(imp[sum].x,imp[sum].y)][o])
flagg[o]=1;
for(int o=1;o<=9;o++)
if(flagg[o]) ress++;
imp[sum].need=ress;
//cout<<sum<<" "<<j<<" "<<i<<" "<<imp[sum].need<<endl;
maxx=maxx+9*chosepoint(imp[sum].x,imp[sum].y);
}
}
}
sort(imp+1,imp+1+sum,cmp);
dfs(1,0);
if(!flag){
cout<<-1;
return 0;
}
cout<<ans+ans1;
return 0;
}