社区讨论
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 条回复,欢迎继续交流。
正在加载回复...