80 pts 造福后人
查看原帖
80 pts 造福后人
654958
Light_az楼主2023/3/1 21:09

有点玄学,但是从 (9,9)(9,9) 开始往 (1,1)(1,1) 搜竟然比 从 (1,1)(1,1) 开始往 (9,9)(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;
}
2023/3/1 21:09
加载中...