求助 A*写炸了 就AC了一个点
查看原帖
求助 A*写炸了 就AC了一个点
113326
DLSINNOCENCE楼主2020/10/25 12:08

码了一遍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);
}
2020/10/25 12:08
加载中...