易知走到一个点再返回上一个状态一定不是最优,故将dx,dy数组这样设计:
const int dx[4]={0,1,-1,0};
const int dy[4]={1,0,0,-1};
再记录上一个状态pre,如果pre+i==3说明返回了上一个状态,直接剪枝
for(int i=0;i<4;i++){
int xx=x+dx[i],yy=y+dy[i];
if(xx<0||xx>=3||yy<0||yy>=3||pre+i==3) continue;//直接剪枝
swap(m[x][y],m[xx][yy]);
if(g+h()<=dep&&!flag) dfs(g+1,xx,yy,i);
swap(m[x][y],m[xx][yy]);
}
实测效率提升巨巨巨巨巨巨巨大ヾ(≧▽≦*)o