测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A39865. 数字变换给定一个包含5个数字(0-9)的字符串,例如 “02943”,请将“12345”变换到它。 你可以采取3种操作进行变换 1. 交换相邻的两个数字 2. 将一个数字加1。如果加1后大于9,则变为0 3. 将一个数字加倍。如果加倍后大于9,则将其变为加倍后的结果除以10的余数。 最多只能用第2种操作3次,第3种操作2次 求最少经过多少次操作可以完成变换。输入有最多 100,000 组数据 每…

填空题 困难

题目描述

数字变换

给定一个包含5个数字(0-9)的字符串,例如 “02943”,请将“12345”变换到它。 你可以采取3种操作进行变换 

1. 交换相邻的两个数字 

2. 将一个数字加1。如果加1后大于9,则变为0 

3. 将一个数字加倍。如果加倍后大于9,则将其变为加倍后的结果除以10的余数。 

最多只能用第2种操作3次,第3种操作2次 求最少经过多少次操作可以完成变换。

输入

有最多 100,000 组数据 每组数据就是包含5个数字的字符串

输出

对每组数据,输出将"12345"变换到给定字符串所需要的最少操作步数。如果无法变换成功,输出-1

样例输入

12435

99999

12374

样例输出

1

-1

3

提示

由于测试数据太多,如果对每组数据都从头进行搜索,就会超时。 建议先做预处理,即以“12345”作为初始状态做一遍彻底的广搜,找出“12345”经合法变换能够到达的所有字符串,并记录到达这些字符串各需要多少步操作。 然后对读入的每组数据,在上述预处理记录的结果中进行查询即可。

参考答案

#include<iostream> #include<string> #include<cstring> #include<cstdlib> #include<queue> using namespace std; char a[6] = "12345"; bool vis[100000][4][3]; int ans[100000]; struct node{ string a; int op2, op3, step; node(string aa, int o2, int o3, int ss = 0):a(aa),op2(o2),op3(o3), step(ss){}; }; queue<node>q; int main(){ memset(vis, false, sizeof(vis)); memset(ans, -1, sizeof(ans)); q.push(node("12345",0,0)); vis[12345][0][0] = true; ans[12345] = 0; while(!q.empty()){ node no = q.front(); q.pop(); string temp = no.a; if(ans[int(atof(temp.c_str()))]==-1)ans[int(atof(temp.c_str()))] = no.step; // cout<<no.a<<endl; //第一种操作 for(int i = 0; i < 4; i++){ swap(temp[i], temp[i+1]); if(!vis[int(atof(temp.c_str()))][no.op2][no.op3]){ vis[int(atof(temp.c_str()))][no.op2][no.op3] = true; q.push(node(temp, no.op2, no.op3, no.step+1)); } swap(temp[i], temp[i+1]); } //第二种操作 if(no.op2<3){ for(int i = 0; i < 5; i++){ temp = no.a; int num = temp[i] - '0'; num++; if(num==10) num = 0; temp[i] = '0'+num; if(!vis[int(atof(temp.c_str()))][no.op2+1][no.op3]){ vis[int(atof(temp.c_str()))][no.op2+1][no.op3] = true; q.push(node(temp, no.op2+1, no.op3, no.step+1)); } } } //第三种操作 if(no.op3<2){ for(int i = 0; i < 5; i++){ temp = no.a; int num = temp[i] - '0'; num*=2; if(num>9) num %= 10; temp[i] = '0'+num; if(!vis[int(atof(temp.c_str()))][no.op2][no.op3+1]){ vis[int(atof(temp.c_str()))][no.op2][no.op3+1] = true; q.push(node(temp, no.op2, no.op3+1, no.step+1)); } } } } while(cin>>a){ cout<<ans[int(atof(a))]<<endl; } return 0; }
上一题 下一题