记录编号 156362 评测结果 AAAAAAAAAA
题目名称 [HAOI 2013]遥控器 最终得分 100
用户昵称 Gravatarfyb 是否通过 通过
代码语言 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;
}