A*(A - Star) - Eight - HDU - 1043
題意:
~
Sample Input
2 3 4 1 5 x 7 6 8
Sample Output
ullddrurdllurdruldr
Time limit: 5000 ms
Memory limit: 32768 kB
Special judge : Yes
分析:
具體落實:
注意:
代碼:
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<queue>
#include<unordered_map>
#define P pair<int,string>
using namespace std;
int f(string start)
{
int res=0;
for(int i=0;i<9;i++)
if(start[i]!='x')
{
int t=start[i]-'1';
res+=abs(i/3-t/3)+abs(i%3-t%3);
}
return res;
}
string bfs(string start)
{
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
char op[4]={'u','d','l','r'};
string end="12345678x";
unordered_map<string,pair<string,char>> pre;
unordered_map<string,int> d;
priority_queue<P,vector<P>,greater<P>> heap;
d[start]=0;
heap.push(make_pair(f(start),start));
while(heap.size())
{
P t=heap.top();
heap.pop();
string state=t.second;
int step=d[state];
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+dir[i][0],b=y+dir[i][1];
if(a>=0&&a<3&&b>=0&&b<3)
{
swap(state[x*3+y],state[a*3+b]);
if(!d.count(state)||d[state]>step+1)
{
d[state]=step+1;
heap.push(make_pair(d[state]+f(state),state));
pre[state]=make_pair(source,op[i]);
}
swap(state[x*3+y],state[a*3+b]);
}
}
}
string res;
while(start!=end)
{
res+=pre[end].second;
end=pre[end].first;
}
reverse(res.begin(),res.end());
return res;
}
int main()
{
string c;
while(cin>>c)
{
string seq,start;
start+=c;
if(c!="x") seq+=c; //用於計算逆序對數量
for(int i=0;i<8;i++)
{
cin>>c;
start+=c;
if(c!="x") seq+=c;
}
int cnt=0;
for(int i=0;i<7;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;
}