遥控器"/>
题目543遥控器
遥 控 器时间限制:1000 ms | 内存限制:65535 KB
难度:3
描述
Dr.Kong有一台高级电视机,这台电视机可以接受100个频道(从0到99编号)。电视的配套遥控器有13个按钮:
1 2 3 ↑
4 5 6 ↓
7 8 9
— 0
当按"↑"键时,当前频道编号会增加1(如果当前为99频道,则会切换到0频道)。如果按"↓"键,当前频道编号会减小1(如果当前为0频道,则会切换到99频道)。当要切换到0~9频道时,可以直接在遥控器上按相应的键。当要切换到10~99频道时,可以先按"—"键,然后按2个与频道编号相对应的数字键(即先按与频道编号的十位数字相对应的键,然后按与个位数字相对应的键)。
由于遥控器长时间的使用和某些未知原因,遥控器上的某些键已经坏了,不能再起作用了。现在你的任务是,能否告诉Dr.Kong,如何用最少的按键次数来将频道从编号X切换到编号Y。
输入
第一行: N表示有N组测试数据. (1<=N<=5)
对每组测试数据有5行,前4行包含遥控器上每个按键的信息。0表示对应的键坏了,1表示对应的键可以使用.第5行包含2个整数,分别是X 和 Y (0 <= X <= 99; 0 <= Y <= 99).
输出
对每组测试数据输出一行,即将频道从编号X切换到编号Y所需要的最小按键次数.如果不可能将频道从编号X 切换到编号Y,则输出-1.
样例输入
20 0 1 1 1 1 1 11 1 11 123 521 1 1 01 1 1 01 0 10 123 52
样例输出
4-1
#include<stdio.h>
int num[10],oper[4];
int stepOfDir(int m,int n) //使用上下键时从m到n最少需要多少步
{int res=200,down,up;if(m==n)return 0;if(oper[1]==0&&oper[0]==0)return -1;up=(n+100-m)%100;down=100-up;if(oper[1]==1) //↑可以使用res=up;if(oper[0]==1) //↓可以使用res=res<down?res:down;return res; //-1表示无法使用
}
int test(int m,int n) //测试能否使用数字键切换到n频道
{int a,b;if(m==n)return 0;if(n<10 && num[n]==1)return 1;else if(n<10 && num[n]==0)return -1;b=n%10;a=n/10;if(num[a]==1 && num[b]==1 && oper[2]==1)return 3;elsereturn -1;
}
int main()
{int t,x,y,res,i;scanf("%d",&t);while(t--){res=200;scanf("%d%d%d%d",&num[1],&num[2],&num[3],&oper[1]); //oper[1]代表↑scanf("%d%d%d%d",&num[4],&num[5],&num[6],&oper[0]); //oper[0]代表↓scanf("%d%d%d",&num[7],&num[8],&num[9]);scanf("%d%d",&oper[2],&num[0]); //oper[2]代表 —scanf("%d%d",&x,&y);for(i=0;i<=99;i++){int a=test(x,i);int b=stepOfDir(i,y);if(a>-1 && b>-1 && res>a+b)res=a+b;}if(res==200)printf("%d\n",-1);elseprintf("%d\n",res);}return 0;
}
更多推荐
题目543遥控器
发布评论