analysis
搜索,思路很好想,只是要考虑如何优化:从0个数少的行开始搜索(但我没有这样搞,所以吸了点氧)
蒟蒻现在遇到的各种搜索优化大概可以分为一下几类:
- 一般的优化:
- 记忆化
- 剪枝(最优化剪枝,可行性剪枝)
- 比较不一般的优化
- 搜索次序上优化,降低dfs树的高度
- 某些难以名状的优化
code
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
#define loop(i,st,en) for(register int i=st;i<=en;++i)
#define anti_loop(i,st,en) for(register int i=st;i>=en;--i)
#define clean(arry,num) memset(arry,num,sizeof(arry))
#define ll long long
#define max(a,b) ((a>b)?a:b)
#define min(a,b) ((a<b)?a:b)
#define map fseff
const int maxn=12;
int map[maxn][maxn];
bool visx[maxn][maxn],visy[maxn][maxn],vist[maxn][maxn];
int _point[10][10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,6,6,6,6,6,6,6,6,6,
-1,6,7,7,7,7,7,7,7,6,
-1,6,7,8,8,8,8,8,7,6,
-1,6,7,8,9,9,9,8,7,6,
-1,6,7,8,9,10,9,8,7,6,
-1,6,7,8,9,9,9,8,7,6,
-1,6,7,8,8,8,8,8,7,6,
-1,6,7,7,7,7,7,7,7,6,
-1,6,6,6,6,6,6,6,6,6};
int _div[10][10]={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
-1,1,1,1,2,2,2,3,3,3,
-1,1,1,1,2,2,2,3,3,3,
-1,1,1,1,2,2,2,3,3,3,
-1,4,4,4,5,5,5,6,6,6,
-1,4,4,4,5,5,5,6,6,6,
-1,4,4,4,5,5,5,6,6,6,
-1,7,7,7,8,8,8,9,9,9,
-1,7,7,7,8,8,8,9,9,9,
-1,7,7,7,8,8,8,9,9,9};
template<typename T>void read(register T &x){
x=0;register char r=getchar();T neg=1;
while(r>'9'||r<'0'){if(r=='-')neg=-1;r=getchar();}
while(r>='0'&&r<='9'){x=(x<<1)+(x<<3)+r-'0';r=getchar();}
x*=neg;
}
bool fix[maxn][maxn];
int maxx=-1;
void dfs(register int x,register int y,register int w){
if(x==1&&y>=10){
maxx=max(w,maxx);
return;
}
if(fix[x][y]){
if(x>=9)dfs(1,y+1,w+_point[x][y]*map[x][y]);
else dfs(x+1,y,w+_point[x][y]*map[x][y]);
return;
}
loop(i,1,9){
if(visx[x][i]||visy[y][i]||vist[_div[x][y]][i])continue;
visx[x][i]=visy[y][i]=vist[_div[x][y]][i]=true;map[x][y]=i;
if(x>=9)dfs(1,y+1,w+_point[x][y]*i);
else dfs(x+1,y,w+_point[x][y]*i);
visx[x][i]=visy[y][i]=vist[_div[x][y]][i]=false;map[x][y]=0;
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("datain.txt","r",stdin);
#endif // ONLINE_JUDGE
clean(map,0);clean(visx,false),clean(visy,false),clean(vist,false);
clean(fix,false);
loop(i,1,9){
loop(j,1,9){
read(map[i][j]);
if(map[i][j])fix[i][j]=true,visx[i][map[i][j]]=visy[j][map[i][j]]=vist[_div[i][j]][map[i][j]]=true;
}
}
dfs(1,1,0);printf("%d\n",maxx);
return 0;
}