NYOJ543
这题给跪了 。。。。。。。。。。
来几个测试数据:
1.测试你的 上下键问题
0 0 0 1
0 0 0 0
0 0 0
0 0
99 0
答案为 1
0 0 0 0
0 0 0 1
0 0 0
0 0
0 99
答案为 1
2 . 测试你跳键
1 1 1 0
1 1 1 0
1 1 1
1 1
8 99 和 99 8
答案为 3 和 1
3.来个混合
1 0 1 0
0 0 0 1
0 0 0
1 0
96 0 和 99 32
答案为2 和 4
枚举+打表
难在情况理清楚
注意一个细节,就是跳到 0-9 不需要leap 键!!!!!!
#include<stdio.h> #include<string.h> #define min(a,b) a<b?a:b #define INF 1000 int num[10]; int leap ,up, down; int x,y; int charge[100]; void read( ) { scanf("%d %d %d %d",&num[1],&num[2],&num[3],&up); scanf("%d %d %d %d",&num[4],&num[5],&num[6],&down); scanf("%d %d %d",&num[7],&num[8],&num[9]); scanf("%d %d",&leap,&num[0]); scanf("%d %d",&x,&y); } int get_up( int l , int r ) { if( l < r) return r - l; return 100 -l + r; } int get_down(int l,int r) { if(l < r ) return 100 - r + l; return l - r ; } int main() { int n; int i,j; int ans ; scanf("%d",&n); while(n--) { read(); memset(charge,0,sizeof(charge)); ans =INF; if(x==y) { printf("0\n"); continue; } if(y<10) { if(num[y])ans = 1; } if(leap) { for(i = 0;i<=9;i++) if(num[i]) { for(j = 0;j<=9;j++) if(num[j]) charge[i*10+j] = 1; } if(charge[y] ) ans = min( ans ,3); } if(up) { ans=min( ans,get_up(x,y)); for( i =0;i<100;i++) if(charge[i] && i>=10 ) { ans = min( ans ,get_up(i,y)+3); } else if(i<=9 && num[i] ) { ans = min( ans ,get_up(i,y)+1); } } if(down) { ans = min(ans,get_down(x,y)); for( i =0;i<100;i++) if(charge[i] && i>=10) { ans = min( ans ,get_down(i,y)+3); } else if(i<=9 &&num[i]) { ans = min( ans ,get_down(i,y)+1); } } if(ans == INF )ans = -1; printf("%d\n",ans); } return 0; }