比赛 防止浮躁的小练习v0.3 评测结果 WWWWWWWTTW
题目名称 表达式 最终得分 0
用户昵称 Rapiz 运行时间 5.960 s
代码语言 C++ 内存使用 0.25 MiB
提交时间 2016-10-12 21:24:03
显示代码纯文本
#include<cstdio>
#include<map>
#include<queue>
#include<algorithm>
#define file(x) "expressb."#x
//#define PRODUCE
using std::map;
using std::queue;
using std::min;
using std::max;
int n,k;
map<int,int> s;
struct NODE{int a,stp;
NODE(int x,int y):a(x),stp(y){
};
};
int gsum(int a){
	int ret=0;
	while(a) ret+=a%10,a/=10;
	return ret;
}
int gmx(int a){
	int ret=0;
	while(a) ret=max(ret,a%10),a/=10;
	return ret;
}
int gmn(int a){
	int ret=1<<30;
	while(a) ret=min(ret,a%10),a/=10;
	return ret;
}
int op(int a,int b){
	return gsum(a)*gmx(b)+gmn(b);
}
void show(int ls,int it,int stp){
	#ifdef PRODUCE
	printf("%d # %d = %d * %d + %d = %d (%d)\n",ls,it,gsum(ls),gmx(it),gmn(it),op(ls,it),stp);
	#endif
}
typedef map<int,int>::iterator IT;
int solve(){
	scanf("%d%d",&n,&k);
	s.clear();
	s[n]=0;
	queue<NODE> q;
	NODE u(n,0);
	q.push(u);
	while(!q.empty()){
		NODE un=q.front();q.pop();
		int u=un.a,stp=un.stp;
		IT it;
		for(it=s.begin();it!=s.end();it++) {
			int t=op(u,it->first);
			if(!s.count(t)) s[t]=stp+it->second+1,q.push(NODE(t,stp+it->second+1)),show(u,it->first,stp+it->second+1);
			else s[t]=min(s[t],stp+it->second+1);
			t=op(it->first,u);
			if(!s.count(t)) s[t]=stp+it->second+1,q.push(NODE(t,stp+it->second+1)),show(it->first,u,stp+it->second+1);
			else s[t]=min(s[t],stp+it->second+1);
		}
	}
	if(s.count(k)) return s[k];
	else return -1;
}
int main(){
	freopen(file(in),"r",stdin);
	freopen(file(out),"w",stdout);
	int T;scanf("%d",&T);
	while(T--) printf("%d\n",solve());
}