#include <iostream>
#include <map>
#include <string>
#include <queue>
using namespace std;
struct point
{
int step;
string s;
};
string e;
map<string,int> my;
queue<point> q;
int BFS(point st)
{
point t, tt;
string ss; int i;
while(!q.empty())
q.pop();
q.push(st);
my[st.s] = 1;
while(!q.empty())
{
t = q.front();
q.pop();
for(ss = t.s, i = 0; i < 6; i++)
if(ss[i] != e[i])
break;
if(i == 6)
return t.step;
ss = t.s;
swap(ss[0], ss[ss[6] - '0']);//Swap0:
if(!my.count(ss))
{
tt.s = ss;
tt.step = t.step+1;
q.push(tt);
my[ss] = 1;
}
ss = t.s;
swap(ss[5], ss[ss[6] - '0']); //Swap1
if(!my.count(ss))
{
tt.s = ss;
tt.step = t.step+1;
q.push(tt);
my[ss]=1;
}
ss=t.s;
if(ss[ss[6]-'0'] != '9' && ss[ss[6]-'0'] != e[ss[6]-'0'])
ss[ss[6]-'0'] += 1; //Up:
if(!my.count(ss))
{
tt.s = ss;
tt.step = t.step+1;
q.push(tt);
my[ss]=1;
}
ss = t.s;
if(ss[ss[6]-'0'] != '0' && ss[ss[6]-'0'] != e[ss[6]-'0'])
ss[ss[6]-'0']-=1;//Down:
if(!my.count(ss))
{
tt.s = ss;
tt.step = t.step+1;
q.push(tt); my[ss] = 1;
}
ss = t.s;
if(ss[6]-'0' != 0)//left
{
if(ss[6]!='5') //1 2 3 4位置相同才能移动光标
{
if(ss[ss[6]-'0'] == e[ss[6]-'0'])
ss[6]-=1;
}
else ss[6]-=1;
}
if(!my.count(ss))
{
tt.s = ss;
tt.step = t.step + 1;
q.push(tt);
my[ss] = 1;
}
ss = t.s;
if(ss[6]-'0' != 5)//Right
{
if(ss[6] != '0') //1 2 3 4位置相同才能移动光标
{
if(ss[ss[6] - '0'] == e[ss[6]-'0'])
ss[6] += 1;
}
else
ss[6] += 1;
}
if(!my.count(ss))
{
tt.s = ss;
tt.step = t.step+1;
q.push(tt);
my[ss]=1;
}
}
}
int main()
{
point st;
while( cin >> st.s >> e )
{
my.clear();
st.s += '0';
st.step=0;
cout<<BFS(st)<<endl;
}
return 0;
}
参考链接:http://blog.csdn.net/liang5630/article/details/11993027
poj 1184 聪明的打字员
最新推荐文章于 2018-06-01 17:27:05 发布