遥 控 器
题目
http://acm.nyist.net/JudgeOnline/problem.php?pid=543
这题需要考虑的很多种情况
称这个(—)键为转换键
一、试图直接实现转换
1 当这个数大于10 --
然后判断这个转换键是否可用 不能,--》这里我们要计算这个y在9 ---0 这个频道中能不能转换,转换的次数是多少
能:1----》两个数字键都好
2----》一好一坏 找一个能实现这个转换的最接近这个数的数(使用上下功能找)
3 ----》都坏 找一个能实现这个转换的最接近这个数的数(使用上下功能找)
2 小于10 ---》这儿数字键好
-------》坏了 找一个能实现这个转换的最接近这个数的数(使用上下功能找)
二、使用我们上键进行转换
三、使用我们的下键进行转换
将上述的三个大情况进行判断看那个是次数最少
下面是没有优化的代码 只是进行各大分类讨论
#include <stdio.h>
#include <string.h>
#include <math.h>
int a[16];//遥控器按键
int judge_anjian(int n)//1-9
{
if(n==0) return 13;
else if(n%3 == 0)
return n/3-1+n;
else return n/3+n;
}
int judge_1(int x,int y)//直接跳转
{
int k = 0;
int j,i;
if(y >= 10)
{
if(a[12] == 0)
{
for(i = 9; i >= 0; i--)
{
if(a[judge_anjian(i)] == 1)
{
return (y - i)+1;
break;
}
}
}
else
{
int a1,b1;
a1 = y/10;
b1 = y%10;
b1 = judge_anjian(b1);
a1 = judge_anjian(a1);
if(a[b1] == 1 && a[a1] == 1)//两个键都好
return 3;
else if(a[a1] == 1 && a[b1] == 0)//大数键好 小数键坏了
{
int max_s4 = -1;
int max_x4 = -1;
if(a[8] == 1)//使用上键找
for(i = y; i <= 99; i++)
if(a[judge_anjian(i/10)] == 1 && a[judge_anjian(i%10)] == 1)
{
max_x4 = 3+fabs(i - y);
break;
}
if(a[4] == 1)//使用下键
for(j = y; j >= 0; j --)
if(a[judge_anjian(j/10)] == 1 && a[judge_anjian(j%10)] == 1)
{
max_s4 = 3 + fabs(y - j);
break;
}
if(max_s4 == -1 && max_x4 == -1) return -1;
else
{
if(max_s4 == -1) return max_x4;
else if(max_x4 == -1) return max_s4;
else return max_s4<max_x4?max_s4:max_x4;
}
}
else if(a[a1] == 0 && a[b1] == 1)//大数的键坏了
{
int max_s4 = -1;
int max_x4 = -1;
if(a[8] == 1)//使用上键找
for(i = y; i <= 99; i++)
if(a[judge_anjian(i/10)] == 1 && a[judge_anjian(i%10)] == 1)
{
max_x4 = 3+ fabs(y - i);
break;
}
if(a[4] == 1)//使用下键
for(j = y; j >= 0; j --)
if(a[judge_anjian(j/10)] == 1 && a[judge_anjian(j%10)] == 1)
{
max_s4 = 3 +fabs(j - y);
break;
}
if(max_s4 == -1 && max_x4 == -1) return -1;
else
{
if(max_s4 == -1) return max_x4;
else if(max_x4 == -1) return max_s4;
else return max_s4<max_x4?max_s4:max_x4;
}
}
else//两数字都坏
{
if(a[4] == 0 && a[8] == 0) return -1;
else
{
int hh_x = -1;
int hh_s = -1;
if(a[4] == 1)
for(i = y; i <= 99 ; i++)
{
if(a[i/10] == 1 && a[i%10] == 1)
{
hh_s = judge_1(x,i)+ i - y;
}
if(hh_s != -1) break;
}
if(a[8] == 1)
for(j = y; j >= 0; j--)
{
if(a[j/10] == 1 && a[j%10] == 1)
{
hh_x = judge_1(x,j)+y - j;
}
if(hh_x != -1) break;
}
if(hh_s == -1 && hh_s == -1) return -1;
else
{
if(hh_s == -1) return hh_x;
else if(hh_x == -1) return hh_s;
else return hh_s<hh_x?hh_s:hh_x;
}
}
}
}
}
else// < 10
{
if(1 == a[judge_anjian(y)])
return 1;
else if(a[judge_anjian(y)] == 0)
{
int max_ys = -1;
int max_yx = -1;
if(a[8] == 1)//
{
for(i = y; i < 10; i++)
if(a[judge_anjian(i)] == 1)
{
max_ys = fabs(y - i) +1;
break;
}
}
if(a[4] == 1)
{
for(j = y; j >= 0; j--)
if(a[judge_anjian(j)] == 1)
{
max_yx = fabs(y-j) +1;
break;
}
}
if(max_ys == -1 && max_yx == -1) return -1;
else
{
if(max_ys == -1) return max_yx;
else if(max_yx == -1) return max_ys;
else return max_yx<max_ys?max_yx:max_ys;
}
}
}
}
int judge_s(int x,int y)//使用上键
{
if(a[4] == 1)
if(x <= y)
{
return fabs(y - x);
}
else
{
return fabs(99 - x) + y+1;
}
else return -1;
}
int judge_x(int x,int y)//使用下键
{
if(a[8] == 1)
{
if(x < y)
return x+1 + fabs(99 - y+1);
else
return fabs(x - y);
}
else return -1;
}
int min(int x,int y)
{
if(x != -1 && y != -1)
return x < y ? x:y;
else if( x == -1 && y == -1)
return -1;
else
{
if(x == -1)
return y;
else if(y == -1)
return x;
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int i = 0;
for(i = 1; i <= 13; i++)
scanf("%d",&a[i]);
int min0 = 0;
int min1,min2,min3;
int x,y;
scanf("%d%d",&x,&y);
if(x == y) printf("0\n");
else
{
min1 = judge_1(x,y);
min2 = judge_s(x,y);
min3 = judge_x(x,y);
min0 = min(min(min1,min2),min3);
printf("%d\n",min0);
}
}
return 0;
}