码了一遍A* 结果只AC了一个点……把A*改成普通BFS+吸氧就过了
求帮忙查错
#include<bits/stdc++.h>
using namespace std;
string goal="123804765";
inline int h(string s){
int ans=0;
for(register int i=0;i<s.size();i++) if(s[i]!=goal[i]&&goal[i]!=0) ans++;
return ans;
}
struct node{
int t,value;
string status;
bool operator<(const node &x) const{
return value>x.value;
}
};
priority_queue<node>q;
map<string,bool>mp;
map<string,int>dis;
void bfs(string start){
q.push(node{0,h(start),start});
mp[start]=1;
while(!q.empty()){
node nq=q.top();
if(nq.status==goal){
cout<<nq.t<<endl;
return;
}
q.pop();
int qel=-1;
for(int i=0;i<9;i++) if(nq.status[i]=='0'){
qel=i;
break;
}
for(int j=0;j<4;j++){
node v;
v.t=nq.t+1;
v.status=nq.status;
if(j==0){
if(qel%3<2)
swap(v.status[qel],v.status[qel+1]);}
else if(j==1){
if(qel<6)
swap(v.status[qel],v.status[qel+3]);}
else if(j==2){
if(qel%3>0)
swap(v.status[qel],v.status[qel-1]);}
else{
if(qel>2)
swap(v.status[qel],v.status[qel-3]);}
if(mp[v.status]==0||(mp[v.status]==1&&v.t<dis[v.status])){
dis[v.status]=v.t;
mp[v.status]=1;
v.value=h(v.status);
q.push(v);
}
}
}
}
int main(){
string a;
cin>>a;
bfs(a);
}