检查一下你的双向搜索是不是这么写的:
void dfs1(int x,int num){
if(x==n/2+1) return;
for(......){
dfs1(x+1,num*_);
}
}
void dfs2(int x,int num){
if(x==n+1) return;
for(......){
dfs2(x+1,num*_);
}
}
如果是,那么请改成这样:
void dfs1(int x,int num){
if(x>n) return;
for(......){
dfs1(x+2,num*_);
}
}
void dfs2(int x,int num){
if(x>n) return;
for(......){
dfs2(x+2,num*_);
}
}
具体原因:如果使用前者,会导致前半部分和后半部分的状态数相差几十倍,从而导致搜索没有被很好的优化;而后者则可以解决这个问题,不过需要记得在输入 p 数组后排一下序。