题目链接:登录—专业IT笔试面试备考平台_牛客网
分析:
此题最主要的是要发现,不管初始状态和终止状态如何,当两个点距离一定的时候,它们的最优解也是确定的。
比如起始值的 第一个值 和终止值 第一个值 相差 向上 t1步。
第二个值 和第二个值 相差 向上 t2步
第三个值 和 第三个值 相差 向上 t3步
第四个值 和 第四个值 相差 向上 t4步
也就是状态为t1 t2 t3 t4的时候,它们向上或者向下移动操作的最优解是固定的。
而这个最优解可以使用bfs求最短路径的方式求解。
代码实现:
# include <iostream>
# include <queue>
# include <cstring>
using namespace std;
int dist[100000];
// 可以向上,也可以向下
int dx[10][4] = {
{0,0,0,1},
{0,0,1,0},
{0,1,0,0},
{1,0,0,0},
{0,0,1,1},
{0,1,1,0},
{1,1,0,0},
{0,1,1,1},
{1,1,1,0},
{1,1,1,1}
};
int t;
queue<int> q;
void init()
{
memset(dist,-1,sizeof dist);
q.push(0);
dist[0] = 0;
while(q.size())
{
int idx = q.front();
q.pop();
int temp = idx;
int x1 = temp / 1000;
temp %= 1000;
int x2 = temp / 100;
temp %= 100;
int x3 = temp / 10;
temp %= 10;
int x4 = temp;
for(int k = 0 ; k < 2 ; k++) // k为0则向上,k为1则向下
{
for(int i = 0 ; i < 10 ; i++)
{
int tt1 = 0 ,tt2 = 0 , tt3 = 0 ,tt4 =0;
if(k == 0)
{
tt1 = ( x1 + dx[i][0] ) % 10;
tt2 = ( x2 + dx[i][1] ) % 10;
tt3 = ( x3 + dx[i][2] ) % 10;
tt4 = ( x4 + dx[i][3] ) % 10;
}
else
{
tt1 =( (x1 - dx[i][0]) % 10 + 10) % 10;
tt2 =( (x2 - dx[i][1]) % 10 + 10) % 10;
tt3 =( (x3 - dx[i][2]) % 10 + 10) % 10;
tt4 =( (x4 - dx[i][3]) % 10 + 10) % 10;
}
int ans = tt1 * 1000 + tt2 * 100 + tt3 * 10 + tt4; // 新值
if(dist[ans] != -1) // 算过了
{
continue;
}
else
{
dist[ans] = dist[idx] + 1;
q.push(ans);
}
}
}
}
}
int main()
{
init();
/*
for(int i = 1 ; i <= 1000 ; i++)
{
printf("%d %d\n",i,dist[i]);
}
*/
scanf("%d",&t);
while(t--)
{
int a,b;
scanf("%d %d",&a,&b);
int x1 = ( ( b / 1000 - a / 1000 ) % 10 + 10 ) % 10;
a %= 1000 , b %= 1000;
int x2 = ( (b / 100 - a / 100) % 10 + 10 ) % 10;
a %= 100 , b %= 100;
int x3 = ( (b / 10 - a / 10 ) % 10 + 10 ) % 10;
a %= 10 , b %= 10;
int x4 = ( ( b - a ) % 10 + 10 ) % 10;
int total = x1 * 1000 + x2 * 100 + x3 * 10 + x4;
//printf("%d\n",total);
printf("%d\n",dist[total]);
}
return 0;
}