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