遥 控 器
题目
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; }