题目链接:HAUTOJ 1269
我的思路:从T开始自增或者自减,向S靠近,判断出最少的路径,忽视了一种情况,例如,5没有坏掉,从10到6,我的方法需要4步,而先按一个5,再自增只需要2步,死活过不去。
下列代码思路,从网上找了一个加了注释,0独自判断,从1~500000看哪个键可以按到,然后依次比较按键次数,暴力解题
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int vis[20];
int main()
{
int n,s,t,a;
while(scanf("%d %d %d",&n,&s,&t) != EOF){
memset(vis,0,sizeof(vis));
for(int i = 1; i <= n; i++)
scanf("%d",&a),vis[a] = 1;//坏掉为1,没坏为0
int ans = abs(t - s);
if(!vis[0]) ans = min(ans,t + 1);//如果0没有坏,按0,再加到T
for(int i = 1; i <= 500000; i++)//判断1~500000哪个键可以到达,ok表示
{
int a = i, nl = 0,ok = 1;
while(a && ok){
if(vis[a % 10]) ok = 0;
nl++;
a /= 10;
}
if(ok)//若可以到达,判断是不是最小
ans = min(ans,abs(i - t) + nl);
}
printf("%d\n",ans);
}
return 0;
}