遥 控 器
时间限制:
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.
- 样例输入
-
2
-
0 0 1 1
-
1 1 1 1
-
1 1 1
-
1 1
-
23 52
-
1 1 1 0
-
1 1 1 0
-
1 0 1
-
0 1
-
23 52
- 样例输出
-
4
-
-1
刚开始用搜索做的,样例是搞出来了,提交RuntimeError,也没改出来,这是网上思路:
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; #define inf 999 int num[10];//保存0-9键是否损坏 int x,y; int ad,les;//加,减 int wap;//交换 int swap_num(int a,int b) {//快速转换 if(a==b) return 0; else if(b>=0&&b<=9&&num[b]==1) {//目标频道是单位数,一步到位 return 1; } else if(b>=10&&num[b/10]==1&&num[b%10]==1&&wap==1) {//目标频道是2位数,且'--'键完好,3步到位 return 3; } else return inf;//不能到达 } int add_less(int a,int b) { int ans1=inf; int ans2=inf; if(ad==1) {//向上换台 if(a<=b) { ans1= b-a; } else { ans1= 99-a+b+1; } } if(les==1) {//向下换台 if(a>=b) { ans2= a-b; } else { ans2=99-b+a+1; } } return min(ans1,ans2);//二者取最小 } int main() { int k; scanf("%d",&k); while(k--) { scanf("%d %d %d %d",&num[1],&num[2],&num[3],&ad);//输入按键的状态 scanf("%d %d %d %d",&num[4],&num[5],&num[6],&les); scanf("%d %d %d",&num[7],&num[8],&num[9]); scanf("%d %d",&wap,&num[0]); scanf("%d %d",&x,&y);//输入起始频道,终止频道 int res=inf; for(int i=0;i<=99;i++) {//枚举0-99,以i为中间桥梁,转换到目标频道 res=min(res,swap_num(x,i)+add_less(i,y)); } if(res==inf) printf("-1\n"); else printf("%d\n",res); } return 0; }