这题看上去是难度为2的省选题,类型里写的是搜索,但是真的不是一个模拟水题么?
考虑最最小的解应该是输入个位数,然后是个位数加减2,然后是输入-两位数,然后是个位数加加加加加或者减减减减减,然后是-两位数加加加加加或者减减减减减。那么就挨个考虑每种情况呗。
具体实现看代码
using namespace std; int i,f; int top,end,ans[200]; bool t[20]; bool shang,xia,gang; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); //freopen("123.in","r",stdin); //freopen("123.out","w",stdout); cin>>t[1]>>t[2]>>t[3]>>shang>>t[4]>>t[5]>>t[6]>>xia>>t[7]>>t[8]>>t[9]>>gang>>t[0]; cin>>top>>end; for(i=0;i<=99;i++) ans[i]=2000; ans[top]=0;//直接就在top了,答案是0 for(i=0;i<=9;i++) if(t[i]) ans[i]=min(ans[i],1);//个位数的台是可能可以1步达到的,它要求对应的数能用 if(gang)//十位数的台要三位,它要求gang和那俩数字能用 for(i=1;i<=9;i++) for(f=0;f<=9;f++) if(t[i]&&t[f]) ans[i*10+f]=min(ans[i*10+f],3); if(shang)//考虑加加加加,更新答案 for(i=0;i<=99;i++) for(f=1;f<=99;f++) ans[(i+f)%100]=min(ans[(i+f)%100],ans[i]+f); if(xia)//考虑减减减减,更新答案 for(i=0;i<=99;i++) for(f=1;f<=100;f++) ans[(i-f+100)%100]=min(ans[(i-f+100)%100],ans[i]+f); if(ans[end]==2000)//最大的解也不过是它小一的两位数减减减或者它大一的两位数加加加得到,为100.一旦更新至少比2000小啊,现在发现还是2000说明没有被更新过,这个台用不了了,输出-1 cout<<-1; else cout<<ans[end]; }