struct AStar{
// 计算预估代价
static int getH(const string& status, const string& target){
int ret = 0;
for(int i=0;i < 4;i++){
int dist = abs(int(status[i]) - int(target[i]));
ret+= min(dist,10-dist);
}
return ret;
}
// 构造函数
AStar(const string& status, const string& target, int g): status_{status},g_{g},h_{getH(status,target)} {
f_ = h_+g_;
}
// 重载 < 升序
bool operator < (const AStar& that) const{
return f_>that.f_;
}
string status_;
int g_; // 从起点(初始状态)开始的距离函数 当前代价
int h_; // 到终点(最终状态)的距离函数 预估代价
int f_; // 以及每个点的估价函数 总代价
};
class Solution {
public:
int openLock(vector<string>& deadends, string target) {
if(target == "0000"){
return 0;
}
unordered_set<string> dead(deadends.begin(),deadends.end());
if(dead.count("0000")>0 || dead.count(target)>0){
return -1;
}
auto num_prev = [](char x)->char{
return (x == '0'? '9':x-1);
};
auto num_subv = [](char x)-> char{
return (x == '9'? '0':x+1);
};
auto get = [&](string& status)->vector<string>{
vector<string> ret;
for(int i=0;i<4;i++){
char te = status[i];
status[i] = num_prev(te);
ret.push_back(status);
status[i] = num_subv(te);
ret.push_back(status);
status[i] = te;
}
return ret;
};
unordered_set<string> see ={"0000"};
priority_queue<AStar> q;
q.emplace("0000",target,0);
while(!q.empty()){
AStar top = q.top();
q.pop();
for(auto&& s: get(top.status_)){
if(dead.count(s)>0 || see.count(s)>0){
continue;
}
if(s == target){
return top.g_+1;
}
q.emplace(s,target,top.g_+1);
see.emplace(move(s));
}
}
return -1;
}
};
搜索——A*
最新推荐文章于 2024-07-06 07:39:36 发布