#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
int first[5],end[5];
int vis[20010];
using namespace std;
struct D
{
int d;
int p[5];
};
int hash(int *s)
{
int temp=0;
for(int i = 0; i < 4; i++)
temp += s[i] + temp*10;
return temp;
}
int try_insert(int *s)
{
int x = hash(s);
if(!vis[x])
return vis[x] = 1;
return 0;
}
int solve()
{
queue<D> q;
D u,v;
u.d = 0;
memcpy(u.p,first,sizeof(first));
q.push(u);
while(!q.empty())
{
u = q.front();
q.pop();
if(!memcmp(u.p,end,sizeof(end)))
{
printf("%d\n",u.d);
return 0;
}
for(int i = 0; i < 4; i++)
{
v.d = u.d+1;
memcpy(v.p,u.p,sizeof(u.p));
v.p[i] = (10+u.p[i]+1)%10;
if(try_insert(v.p))
q.push(v);
v.d = u.d+1;
memcpy(v.p,u.p,sizeof(u.p));
v.p[i] = (10+u.p[i]-1)%10;
if(try_insert(v.p))
q.push(v);
}
}
printf("-1\n");
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
for(int i = 0; i < 4; i++)
scanf("%d",&first[i]);
for(int i = 0; i < 4; i++)
scanf("%d",&end[i]);
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
int te[5];
for(int j = 0; j < 4; j++)
scanf("%d",&te[j]);
vis[hash(te)] = 1;
}
solve();
}
return 0;
}
#include<cstring>
#include<cstdlib>
#include<queue>
int first[5],end[5];
int vis[20010];
using namespace std;
struct D
{
int d;
int p[5];
};
int hash(int *s)
{
int temp=0;
for(int i = 0; i < 4; i++)
temp += s[i] + temp*10;
return temp;
}
int try_insert(int *s)
{
int x = hash(s);
if(!vis[x])
return vis[x] = 1;
return 0;
}
int solve()
{
queue<D> q;
D u,v;
u.d = 0;
memcpy(u.p,first,sizeof(first));
q.push(u);
while(!q.empty())
{
u = q.front();
q.pop();
if(!memcmp(u.p,end,sizeof(end)))
{
printf("%d\n",u.d);
return 0;
}
for(int i = 0; i < 4; i++)
{
v.d = u.d+1;
memcpy(v.p,u.p,sizeof(u.p));
v.p[i] = (10+u.p[i]+1)%10;
if(try_insert(v.p))
q.push(v);
v.d = u.d+1;
memcpy(v.p,u.p,sizeof(u.p));
v.p[i] = (10+u.p[i]-1)%10;
if(try_insert(v.p))
q.push(v);
}
}
printf("-1\n");
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
for(int i = 0; i < 4; i++)
scanf("%d",&first[i]);
for(int i = 0; i < 4; i++)
scanf("%d",&end[i]);
scanf("%d",&n);
for(int i = 0; i < n; i++)
{
int te[5];
for(int j = 0; j < 4; j++)
scanf("%d",&te[j]);
vis[hash(te)] = 1;
}
solve();
}
return 0;
}
本文探讨了如何通过算法解决特定数值序列的转换问题,包括序列的起点、终点定义、状态跟踪、路径搜索等关键步骤。文章详细介绍了使用队列、哈希表等数据结构进行优化的方法,并提供了实例代码来实现解决方案。

被折叠的 条评论
为什么被折叠?



