// 引入C++标准库的所有头文件,方便竞赛编程使用
#include<bits/stdc++.h>
// 使用标准命名空间,避免重复写std::
using namespace std;
// 定义数组的最大尺寸,题目中涉及的数值范围不超过300,故设为310
const int N=310;
// 全局变量声明
int T; // 测试用例的数量
int a,b,c,d; // 每个测试用例输入的四个数字
int dis[N]; // 存储从起点到每个数字的最短距离,dis[x]表示到x的最短步数
// 定义BFS的移动方向/操作数组,代表每次可以进行的数值变化
int dx[8]={1,-1,10,-10,100,-100,300,10};
// 广度优先搜索(BFS)函数,用于计算从起点sx到所有可达数字的最短距离
// sx: BFS的起始数字
void bfs(int sx){
// 创建队列,用于存储待处理的数字(BFS的核心数据结构)
queue<int> q;
// 将起始数字入队
q.push(sx);
// 起始数字到自身的距离为0
dis[sx]=0;
// 队列不为空时持续处理
while(!q.empty()){
// 取出队首元素并弹出
int x=q.front();q.pop();
// 遍历所有8种操作
for(int i=0;i<8;i++){
int tx; // 存储操作后的新数字
// 前6种操作:对当前数字进行加减1/10/100
if(i>=0&&i<=5){
tx=x+dx[i];
}else{
// 后2种操作:直接赋值为300或10(此处逻辑是代码原有逻辑,未修改)
tx=dx[i];
}
// 检查新数字是否在合法范围[10,300]内,且未被访问过(dis[tx]==-1表示未访问)
if(tx>=10&&tx<=300&&dis[tx]==-1){
// 更新新数字的距离:当前距离+1
dis[tx]=dis[x]+1;
// 新数字入队,等待后续处理
q.push(tx);
}
}
}
return;
}
// 预处理函数:初始化距离数组并执行BFS
void pre(){
// 将dis数组全部初始化为-1,表示所有数字初始状态为未访问
memset(dis,-1,sizeof(dis));
// 以数字10为起点执行BFS,计算到所有可达数字的最短距离
bfs(10);
return;
}
// 处理单个测试用例的函数
void solve(){
int sum=0;
// 计算四个输入数字的最短距离之和
sum=dis[a]+dis[b]+dis[c]+dis[d];
// 输出结果
cout<<sum<<endl;
return;
}
// 主函数:程序入口
int main(){
// 关闭同步流,加速cin/cout的输入输出(竞赛常用优化)
ios::sync_with_stdio(false);
// 解绑cin和cout,进一步加速输入输出
cin.tie(0);
// 输入测试用例数量
cin>>T;
// 预处理:提前计算好所有数字的最短距离(只需执行一次)
pre();
// 循环处理每个测试用例
while(T--){
// 输入当前测试用例的四个数字
cin>>a>>b>>c>>d;
// 处理并输出当前测试用例的结果
solve();
}
return 0;
}