有点玄学,但是从 (9,9) 开始往 (1,1) 搜竟然比 从 (1,1) 开始往 (9,9) 搜要快一点
#include<bits/stdc++.h>
#define ll long long
#define F(i,j,n) for(int i=j;i<=n;i++)
#define Test ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
const int N=1e7+10,NN=1e4+10;
ll n,m,k,x,y,u,v,w,cnt=0,ans=0,t=0,r,len,T,Can;
ll mini=INT_MAX,maxi=0,Mod;
string s1,s2;
ll a[15][15];
bool h[15][15],l[15][15],fa[15][15][15];
ll bei[15][15]={
{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}
};
ll sum(){
ll ans=0;
F(i,0,8) F(j,0,8) ans+=a[i][j]*bei[i][j];
return ans;
}
void dfs(int n){
if(n==-1){
ans=max(ans,sum());
return ;
}
int i=n/9,j=n%9;
if(a[i][j]) dfs(n-1);
else{
F(num,1,9){
if(!h[i][num]&&!l[j][num]&&!fa[(i+3)/3][(j+3)/3][num]){
h[i][num]=1;
l[j][num]=1;
fa[(i+3)/3][(j+3)/3][num]=1;
a[i][j]=num;
dfs(n-1);
h[i][num]=0;
l[j][num]=0;
fa[(i+3)/3][(j+3)/3][num]=0;
a[i][j]=0;
}
}
}
}
int main(){
F(i,0,8) F(j,0,8){
cin>>a[i][j];
h[i][a[i][j]]=1;
l[j][a[i][j]]=1;
fa[(i+3)/3][(j+3)/3][a[i][j]]=1;
}
dfs(80);
if(!ans) cout<<-1;
else cout<<ans;
return 0;
}
优化前代码
#include<bits/stdc++.h>
#define ll long long
#define F(i,j,n) for(int i=j;i<=n;i++)
#define Test ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
const int N=1e7+10,NN=1e4+10;
ll n,m,k,x,y,u,v,w,cnt=0,ans=0,t=0,r,len,T,Can;
ll mini=INT_MAX,maxi=0,Mod;
string s1,s2;
ll a[15][15];
bool h[15][15],l[15][15],fa[15][15][15];
ll bei[15][15]={
{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}
};
void print(){
F(i,0,8){
F(j,0,8) cout<<a[i][j]<<" ";
cout<<"\n";
}
exit(0);
}
ll sum(){
ll ans=0;
F(i,0,8) F(j,0,8) ans+=a[i][j]*bei[i][j];
return ans;
}
void dfs(int n){
if(n==81){
ans=max(ans,sum());
return ;
}
int i=n/9,j=n%9;
if(a[i][j]) dfs(n+1);
else{
F(num,1,9){
if(!h[i][num]&&!l[j][num]&&!fa[(i+3)/3][(j+3)/3][num]){
h[i][num]=1;
l[j][num]=1;
fa[(i+3)/3][(j+3)/3][num]=1;
a[i][j]=num;
dfs(n+1);
h[i][num]=0;
l[j][num]=0;
fa[(i+3)/3][(j+3)/3][num]=0;
a[i][j]=0;
}
}
}
}
int main(){
F(i,0,8) F(j,0,8){
cin>>a[i][j];
h[i][a[i][j]]=1;
l[j][a[i][j]]=1;
fa[(i+3)/3][(j+3)/3][a[i][j]]=1;
}
dfs(0);
if(!ans) cout<<-1;
else cout<<ans;
return 0;
}