题意是给你一个地图,地图里有的点是炮台 炮台每隔一段时间回想固定的方向发射一定速度的炮弹,炮弹不能穿过炮台,炮弹只有只有在整点才能打中人,开始你在(0,0)的位置 问你能不能再规定的时间内走到终点;
最对100个炮台,最多走1000步 很明显 把地图预先处理下 及每个点在某一时间有炮弹 那么人就不能走, 开个3维 来标记,还有 数组必须用bool型的要不然要超类存,
?
?
#include#include #include #include using namespace std ; int n ,m ,k ,d ; bool map [101 ][101 ][1001 ]; bool mark [101 ][101 ][1001 ]; struct node { int x ,y ; int tt ; }a ,b ; struct Node { int dir ; int x ,y ; int t ,v ; }bull [110 ]; int dir1 [4 ][2 ]={-1 ,0 ,0 ,1 ,1 ,0 ,0 ,-1 }; int dir [5 ][2 ]={0 ,0 ,0 ,1 ,0 ,-1 ,1 ,0 ,-1 ,0 }; int deal (int x ) { int i ,j ; int di =bull [x ].dir ; int xx ,yy ; for(i =1 ;;i ++) { xx =bull [x ].x +i *dir1 [di ][0 ]*bull [x ].v ; yy =bull [x ].y +i *dir1 [di ][1 ]*bull [x ].v ; if(xx <0 ||xx >n ||yy <0 ||yy >m ) break; if(map [xx ][yy ][0 ]) break; int flag =0 ; if(di ==0 ) { for(j =xx ;j <bull [x ].x ;j ++) if(map [j ][bull [x ].y ][0 ]) {flag =1 ;break;} } else if(di ==1 ) { for(j =bull [x ].y +1 ;j <=yy ;j ++) if(map [bull [x ].x ][j ][0 ]) {flag =1 ;break;} } else if(di ==2 ) { for(j =bull [x ].x +1 ;j <=xx ;j ++) if(map [j ][bull [x ].y ][0 ]){flag =1 ;break;} } else if(di ==3 ) { for(j =yy ;j <bull [x ].y ;j ++) if(map [bull [x ].x ][j ][0 ]) {flag =1 ;break;} } if(flag ) break; j =0 ; int t =i ; while(t <=d ) { map [xx ][yy ][t ]=1 ; j ++; t =i +j *bull [x ].t ; } } return 0 ; } int bfs () { a .x =0 ; a .y =0 ; a .tt =0 ; memset (mark ,0 ,sizeof(mark )); queue <node >q ; mark [a .x ][a .y ][a .tt ]=1 ; q .push (a ); int i ,j ; int flash =0 ; while(!q .empty ()) { b =q .front (); q .pop (); //printf("%d %d\n",b.x,b.y); if(b .x ==n &&b .y ==m ) { printf ("%d\n" ,b .tt ); flash =1 ; break; } for(i =0 ;i <5 ;i ++) { a .x =b .x +dir [i ][0 ]; a .y =b .y +dir [i ][1 ]; a .tt =b .tt +1 ; if(n -a .x +m -a .y >d -a .tt ) continue; if(a .x <0 ||a .x >n ||a .y <0 ||a .y >m ) continue; if(map [a .x ][a .y ][0 ]) continue; if(map [a .x ][a .y ][a .tt ]==0 &&mark [a .x ][a .y ][a .tt ]==0 ) { mark [a .x ][a .y ][a .tt ]=1 ; q .push (a ); } } } if(!flash ) printf ("Bad luck!\n" ); return 0 ; } int main() { int i ,j ; while(~scanf ("%d%d%d%d" ,&n ,&m ,&k ,&d )) { char str [2 ]; memset (map ,0 ,sizeof(map )); for(i =1 ;i <=k ;i ++) { scanf ("%s" ,str ); if(str [0 ]=='N' ) bull [i ].dir =0 ; else if(str [0 ]=='E' ) bull [i ].dir =1 ; else if(str [0 ]=='S' ) bull [i ].dir =2 ; else if(str [0 ]=='W' )bull [i ].dir =3 ; scanf ("%d%d" ,&bull [i ].t ,&bull [i ].v ); scanf ("%d%d" ,&bull [i ].x ,&bull [i ].y ); map [bull [i ].x ][bull [i ].y ][0 ]=1 ; } for(i =1 ;i <=k ;i ++) { deal (i ); } bfs (); } return 0 ; }
?