记录编号 58868 评测结果 AAAAAAAAAA
题目名称 [HAOI 2013]遥控器 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.005 s
提交时间 2013-04-28 21:43:13 内存使用 0.32 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<deque>
#include<fstream>
using namespace std;
int INF=999999;
int X,Y;
int up,down,ext;//上键,下键,扩展键
int num[15]={0};//每个数字键是否能输入
bool able[125]={0};//每个台号是否可直接输入
int numcost[125]={0};//从X台直接输入每个台号的代价
int ans=INF;
void read(void){
	scanf("%d%d%d",&num[1],&num[2],&num[3]);
	scanf("%d",&up);
	scanf("%d%d%d",&num[4],&num[5],&num[6]);
	scanf("%d",&down);
	scanf("%d%d%d",&num[7],&num[8],&num[9]);
	scanf("%d",&ext);
	scanf("%d",&num[0]);
	scanf("%d%d",&X,&Y);
}
void extend_1(void){
	int i;
	for(i=0;i<=9;i++) able[i]=num[i],numcost[i]=1;
}
void extend_2(void){
	if(!ext) return;//不可行
	int i,j;
	for(i=1;i<=9;i++){
		if(num[i]){
			for(j=0;j<=9;j++){
				if(num[j]){
					able[i*10+j]=true;
					numcost[i*10+j]=3;//按三次
				}
			}
		}
	}
}
int dis_up(int a,int b){//从a"上键"到b的代价
	if(b>=a){
		return b-a;
	}
	else return 100+b-a;
}
int dis_down(int a,int b){//从a"下键"到b的代价
	if(b<=a) return a-b;
	else return 100+a-b;
}
void try_num(void){//是否能直接输入Y
	if(able[Y]){
		if(numcost[Y]<ans) ans=numcost[Y];
	}
}
void try_up(void){//试着"++"到Y
	if(!up) return;
	int i;
	int temp;
	for(i=0;i<=99;i++){
		if(able[i]){
			temp=numcost[i]+dis_up(i,Y);
			if(temp<ans) ans=temp;
		}
	}
}
void try_down(void){//试着"--"到Y
	if(!down) return;
	int i,temp;
	for(i=0;i<=99;i++){
		if(able[i]){
			temp=numcost[i]+dis_down(i,Y);
			if(temp<ans) ans=temp;
		}
	}
}
int main(){
	freopen("HAOI2013T5.in","r",stdin);
	freopen("HAOI2013T5.out","w",stdout);
	read();
	extend_1();
	extend_2();
	able[X]=true,numcost[X]=0;//直接可达
	try_num();
	try_up();
	try_down();
	if(ans==INF) printf("-1\n");
	else printf("%d\n",ans);
	return 0;
}