题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1195
解题报告:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue> using namespace std; struct node
{
int num[],step;
}; node start,_end;
bool visit[][][][],flag; void bfs()
{
int i;
node p,q;
queue<node> Q;
memset(visit,false,sizeof(visit));
flag=true;
start.step=;
p=start;
visit[p.num[]][p.num[]][p.num[]][p.num[]]=true;
Q.push(p);
while(!Q.empty())
{
p=Q.front();
Q.pop(); flag=true;
for(i=; i<; i++)
if(p.num[i]!=_end.num[i])
{
flag=false;
break;
}; if(flag)
{
printf("%d\n",p.step);
return;
} for(i=; i<; i++) ///+1
{
q=p;
if(p.num[i]==) q.num[i]=;
else q.num[i]=p.num[i]+;
q.step=p.step+;
if(!visit[q.num[]][q.num[]][q.num[]][q.num[]])
{
visit[q.num[]][q.num[]][q.num[]][q.num[]]=true;
Q.push(q);
}
}
for(i=; i<; i++) ///-1
{
q=p;
if(p.num[i]==) q.num[i]=;
else q.num[i]=p.num[i]-;
q.step=p.step+;
if(!visit[q.num[]][q.num[]][q.num[]][q.num[]])
{
visit[q.num[]][q.num[]][q.num[]][q.num[]]=true;
Q.push(q);
}
}
for(i=; i<; i++) ///相邻交换
{
q=p;
q.num[i]=p.num[i+];
q.num[i+]=p.num[i];
q.step=p.step+;
if(!visit[q.num[]][q.num[]][q.num[]][q.num[]])
{
visit[q.num[]][q.num[]][q.num[]][q.num[]]=true;
Q.push(q);
}
}
}
} int main()
{
int cas,i;
char chf[],chl[];
scanf("%d",&cas);
while(cas--)
{
scanf("%s%s",chf,chl);
for(i=; i<; i++)
{
start.num[i]=chf[i]-'';
_end.num[i]=chl[i]-'';
}
bfs();
}
return ;
}