记录编号 |
156362 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HAOI 2013]遥控器 |
最终得分 |
100 |
用户昵称 |
fyb |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.003 s |
提交时间 |
2015-04-04 13:53:50 |
内存使用 |
0.29 MiB |
显示代码纯文本
#include <stdio.h>
#include <ctype.h>
#define N 100
#define NK 13
#define VERY_LARGE 10000000
#define KUP 10
#define KDOWN 11
#define KC 12
int x,y;
bool can_use[NK];
int d[N];
bool vis[N];
int dfs(int num){
int tmp=VERY_LARGE;
int i,j;
if(d[num])return d[num];
else if(num==y)return 0;
else if(vis[num])return VERY_LARGE;
else{
vis[num]=true;
for(i=0;i<10;i++)
if(can_use[i]&&dfs(i)+1<tmp)
tmp=dfs(i)+1;
if(can_use[KUP]&&dfs((num+1)%N)+1<tmp)
tmp=dfs((num+1)%N)+1;
if(can_use[KDOWN]&&dfs((num+N-1)%N)+1<tmp)
tmp=dfs((num+N-1)%N)+1;
if(can_use[KC])
for(i=1;i<10;i++)if(can_use[i])
for(j=0;j<10;j++)if(can_use[j]){
if(dfs(i*10+j)+3<tmp)
tmp=dfs(i*10+j)+3;
}
vis[num]=false;
return d[num]=tmp;
}
}
int getprint(){
int c;
while(!isdigit(c=getchar()));
return c;
}
void set_use(int ki){
if(getprint()=='1')can_use[ki]=true;
}
int main(){
int i;
freopen("HAOI2013T5.in","r",stdin);
freopen("HAOI2013T5.out","w",stdout);
for(i=1;i<4;i++)set_use(i);
set_use(KUP);
for(i=4;i<7;i++)set_use(i);
set_use(KDOWN);
for(i=7;i<10;i++)set_use(i);
set_use(KC);
set_use(0);
getchar();
scanf("%d%d",&x,&y);
printf("%d",dfs(x)==VERY_LARGE?-1:dfs(x));
return 0;
}