Description
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。
Input
第一行: N 表示有N组测试数据。 (1<=N<=5)
对每组测试数据有5行,前4行包含遥控器上每个按键的信息。0表示对应的键坏了,1表示对应的键可以使用。第5行包含2个整数,分别是X 和 Y (0 <= X <= 99; 0 <= Y <= 99)。
Output
对每组测试数据输出一行,即将频道从编号X切换到编号Y所需要的最小按键次数。如果不可能将频道从编号X 切换到编号Y,则输出-1.
Sample Input
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
Sample Output
4
-1
#include <stdio.h>
#include <string.h>
int book[13];
int visit[100],start,end;
int minus(int x)
{
if(x==0)
return 99;
return x-1;
}
int add(int x)
{
if(x==99)
return 0;
return x+1;
}
int min(int a,int b)
{
if(a>b) return b;
return a;
}
void input()
{
int i;
for(i=1;i<=3;i++)
scanf("%d",&book[i]);
scanf("%d",&book[10]);
for(i=4;i<=6;i++)
scanf("%d",&book[i]);
scanf("%d",&book[11]);
for(i=7;i<=9;i++)
scanf("%d",&book[i]);
scanf("%d%d",&book[12],&book[0]);
}
int dfs(int num)
{
//printf("%d\n",num);
if(num==start) return 0;
int t=99999;
int x1=num/10,x2=num%10;
if(x1==0 && book[x2]==1) return 1;
if(book[10]==1 && visit[minus(num)]==0){
visit[minus(num)]=1;
t=min(dfs(minus(num))+1,t);
}
if(book[11]==1 && visit[add(num)]==0){
visit[add(num)]=1;
t=min(dfs(add(num))+1,t);
}
if(book[x2]==1 && book[x1]==1 && book[12]==1){
t=min(t,3);
}
return t;
}
int main()
{
int N;
scanf("%d",&N);
while(N--)
{
input();
memset(visit,0,sizeof(visit));
scanf("%d%d",&start,&end);
visit[end]=1;
int ans=dfs(end);
if(ans!=99999)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}