社区讨论

75分求助(DFS,5点TLE)

P1074[NOIP 2009 提高组] 靶形数独参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mlnimqtn
此快照首次捕获于
2026/02/15 17:00
3 周前
此快照最后确认于
2026/02/19 18:30
3 周前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n=9,maxx=-1;
int a[10][10];
int score1[10][10]={
{},{0,6,6,6,6,6,6,6,6,6},
   {0,6,7,7,7,7,7,7,7,6},
   {0,6,7,8,8,8,8,8,7,6},
   {0,6,7,8,9,9,9,8,7,6},
   {0,6,7,8,9,10,9,8,7,6},   
   {0,6,7,8,9,9,9,8,7,6},   
   {0,6,7,8,8,8,8,8,7,6},   
   {0,6,7,7,7,7,7,7,7,6},
   {0,6,6,6,6,6,6,6,6,6}
};
int score(){//6,7,8,9,10
	int sum=0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			switch(max(abs(i-5),abs(j-5))){
				case 4:sum+=6*a[i][j];break;
				case 3:sum+=7*a[i][j];break;
				case 2:sum+=8*a[i][j];break;
				case 1:sum+=9*a[i][j];break;
				case 0:sum+=10*a[i][j];break;
			}
		}
	}
	return sum;
}
vector<int> b[10][10];
bool nengtian(int x,int y,int num){
	for(int i=1;i<=9;i++){
		if(i!=y&&a[x][i]==num){
			return 0;
		}
	}
	for(int i=1;i<=9;i++){
		if(i!=x&&a[i][y]==num){
			return 0;
		}
	}
	for(int i=(x/3+bool(x%3)-1)*3+1;i<=(x/3+bool(x%3)-1)*3+3;i++){
		for(int j=(y/3+((y%3)?0:-1))*3+1;j<=(y/3+((y%3)?0:-1))*3+3;j++){
			if((i!=x||j!=y)&&a[i][j]==num){
				return 0;
			}
		}
	}
	return 1;
}
void dfs(int m){
//	int sumx=0;
	if(m>=82){
		maxx=max(maxx,score());
		return;
	}
	int f=m/9+((m%9)?1:0),g=(m%9)?(m%9):9;
//	for(int i=1;i<=9;i++){
//		for(int j=1;j<=9;j++){
//			if(i*9-9+j>=m){
//				switch(max(abs(i-5),abs(j-5))){
//					case 4:sumx+=6*(a[i][j]==0?9:a[i][j]);break;
//					case 3:sumx+=7*(a[i][j]==0?9:a[i][j]);break;
//					case 2:sumx+=8*(a[i][j]==0?9:a[i][j]);break;
//					case 1:sumx+=9*(a[i][j]==0?9:a[i][j]);break;
//					case 0:sumx+=10*(a[i][j]==0?9:a[i][j]);break;
//				}
//			}
//			else
//			{
//				sumx+=a[i][j]*score1[i][j];
//			}
//		}
//	}
//	if(sumx<=maxx){
//		return;
//	}注释掉的代码写上去适得其反(亲测只有40分)
	for(int i=0;i<b[f][g].size();i++){
		if(nengtian(f,g,b[f][g][i])){
			a[f][g]=b[f][g][i];
			
			dfs(m+1);
			a[f][g]=0;
		}
	}
}
signed main(){
	for(int i=1;i<=81;i++){
		cin>>a[i/9+((i%9)?1:0)][(i%9)?(i%9):9];
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(a[i][j]!=0){
				b[i][j].push_back(a[i][j]);
			}
			else{
				for(int ii=1;ii<=9;ii++){
					if(nengtian(i,j,ii)){
						b[i][j].push_back(ii);
					}
				}
			}
		}
	}
	dfs(1);
	cout<<maxx;
	return 0;
}
怎么优化啊? 大佬指教一下,谢谢

回复

0 条回复,欢迎继续交流。

正在加载回复...