95求调
查看原帖
95求调
764877
Boclt28楼主2025/7/23 15:30
#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;
} 

结果:https://www.luogu.com.cn/record/226306987

2025/7/23 15:30
加载中...