您的位置:首页 > 其它

ZOJ 2416题解BFS

2012-02-26 11:49 330 查看
思路:此题属于隐式图的搜索,从1111出发发散成一个
树状结构从每一层中搜索看是否由于目标相等的数,有责打
印无责要还原;先对每个数加1,再减1,最后左右互换;
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<queue>

using namespace std;

typedef struct
{
int data;
int step;
}State;//结构体存放步长和数据;

int Equal(State s1, State s2)//判断两个数相等
{
if(s1.data == s2.data)
return 1;
return 0;
}
int visit[10000], a[5], b[5];
queue<State>q;
int main()
{
int i, ncases;
State start, end;
scanf("%d", &ncases);

while( ncases-- )
{
memset(visit, 0, sizeof(visit));
scanf("%d %d", &start.data, &end.data);
visit[start.data] = 1;
start.step = 0;
q.push(start);
while( !q.empty() )
{
State u = q.front();
q.pop();
if( Equal(u, end) )
{
printf("%d\n", u.step);
break;
}
for(i=0; i<4; i++)
{
b[i] = a[i] = u.data % 10;
u.data = u.data/10;
}
for(i=0; i<4; i++)
{
State v = u;
v.step = u.step + 1;
b[i] = a[i]%9 + 1;
v.data = b[3]*1000 + b[2]*100 + b[1]*10 + b[0];
if( !visit[v.data] )
{
q.push(v);
visit[v.data] = 1;
}
b[i] = a[i];//还原
b[i]--;
if(b[i] == 0)
b[i] = 9;
v.data = b[3]*1000 + b[2]*100 + b[1]*10 + b[0];
if( !visit[v.data] )
{
q.push(v);
visit[v.data] = 1;
}
b[i] = a[i];
}
for(i=0; i<3; i++)
{
b[i] = a[i+1];
b[i+1] = a[i];
State v = u;
v.step = u.step + 1;
v.data = b[3]*1000 + b[2]*100 + b[1]*10 + b[0];
if( !visit[v.data] )
{
q.push(v);
visit[v.data] = 1;
}
b[i] = a[i];
b[i+1] = a[i+1];
}
}
while( !q.empty() )
{
q.pop();
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: