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;
}