遥 控 器
时间限制:
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;
}