POJ - 1077 Eight(A∗算法)
#include<iostream>
#include<algorithm>
#include<map>
#include<queue>
#define x first
#define y second
using namespace std;
typedef pair<int,string> PIS;
typedef pair<char,string> PCS;
int f(string state)
{
int res=0;
for(int i=0;i<9;i++)
if (state[i]!='x')
{
int v=state[i]-'1';
res+=abs(v/3-i/3)+abs(v%3-i%3);
}
return res;
}
string bfs(string start)
{
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
char op[5] = "urdl";
string end="12345678x";
map<string,int> dist;
map<string,pair<char,string> >pre;
priority_queue<PIS,vector<PIS>,greater<PIS> >heap;
heap.push((PIS){f(start), start});
dist[start]=0;
while(heap.size())
{
PIS t=heap.top();heap.pop();
string state=t.y;
if(state==end) break;
int x,y;
for(int i=0;i<9;i++)
if(state[i]=='x')
{
x=i/3,y=i%3;
break;
}
string source=state;
for (int i=0;i<4;i++)
{
int a=x+dx[i],b=y+dy[i];
if(a<0||a>=3||b<0||b>=3) continue;
state=source;
swap(state[x*3+y],state[a*3+b]);
if (dist.count(state)==0||dist[state]>dist[source]+1)
{
dist[state]=dist[source]+1;
pre[state] =(PCS){op[i],source};
heap.push((PIS){dist[state]+f(state),state});
}
}
}
string res;
while(end!=start)
{
res+=pre[end].x;
end=pre[end].y;
}
reverse(res.begin(),res.end());
return res;
}
int main()
{
string start,seq,c;
while(cin>>c)
{
start+=c;
if(c!="x") seq+=c;
}
int cnt=0;
for(int i=0;i<8;i++)
for(int j=i+1;j<8;j++)
if(seq[i]>seq[j])
cnt++;
if(cnt%2) cout<<"unsolvable"<<endl;
else cout<<bfs(start)<<endl;
return 0;
}