记录编号 |
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;
- }