nyist 543 遥 控 器

遥 控 器

题目

?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);elsereturn 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;}人生重要的不是所站的位置,而是所朝的方向

nyist 543 遥 控 器

相关文章:

你感兴趣的文章:

标签云: