Advertisement
Guest User

Untitled

a guest
Aug 19th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <queue>
  3.  
  4. using namespace std;
  5.  
  6. class step
  7.     {
  8.     public:
  9.         int x,y,vx,vy,steps;
  10.         step(int,int,int,int,int);
  11.     };
  12.  
  13. step::step (int a, int b, int c, int d, int e)
  14.     {
  15.     x=a; y=b;
  16.     vx=c; vy=d;
  17.     steps=e;
  18.     }
  19.  
  20. void setdeltavlimits(int& min_delta_v, int& max_delta_v, int v)
  21.     {
  22.     switch(v)
  23.         {
  24.         case -3:
  25.             min_delta_v=0; max_delta_v=1;
  26.         case 3:
  27.             min_delta_v=-1; max_delta_v=0;
  28.         default:
  29.             min_delta_v=-1; max_delta_v=1;
  30.         }
  31.     }
  32.  
  33.  
  34. bool legalcoords(int x, int y, int new_x, int new_y)
  35.     {
  36.     bool islegal=1;
  37.         x--;
  38.         y--;
  39.         if(new_x<0) islegal=0;
  40.         if(new_x>x) islegal=0;
  41.         if(new_y<0) islegal=0;
  42.         if(new_y>y) islegal=0;
  43.         return islegal;
  44.     }
  45.  
  46. int pogoRace()
  47.     {
  48.     int n,x,y,min_delta_vx,max_delta_vx,min_delta_vy,max_delta_vy,new_x,new_y,new_vx,new_vy;
  49.     scanf("%d %d %d",&n,&x,&y);
  50.     char map[x][y];
  51.     bool visited[x][y][7][7];
  52.     for(int i=0;i<y;i++) for(int j=0;j<x;j++) scanf("%d", &map[x][y]);
  53.     queue<step> Q;
  54.     for(int i=y-1;i>=0;i--) for(int j=x-1;j>=0;j--)
  55.         {
  56.         if(map[j][i]='S')
  57.             {
  58.             visited[j][i][3][3]=true;
  59.             Q.push(step(x,y,0,0,0));
  60.             j=0;
  61.             i=0;
  62.             }
  63.         }
  64.  
  65.     while(!Q.empty())
  66.         {
  67.         setdeltavlimits(min_delta_vx,max_delta_vx,Q.front().vx);
  68.         setdeltavlimits(min_delta_vy,max_delta_vy,Q.front().vy);
  69.         for(int i=min_delta_vx;i<=max_delta_vx;i++)
  70.             {
  71.             for(int j=min_delta_vy;j<=max_delta_vx;j++)
  72.                 {
  73.                 new_vx=Q.front().vx+i;
  74.                 new_vy=Q.front().vy+j;
  75.                 new_x=Q.front().x+new_vx;
  76.                 new_y=Q.front().y+new_vy;
  77.                 if(legalcoords(new_x,new_y,x,y))
  78.                     {
  79.                     if(visited[new_x][new_y][new_vx+3][new_vy+3]==false)
  80.                         {
  81.                         if(map[new_x][new_y]=='.')
  82.                             {
  83.                             Q.push(step(new_x,new_y,new_vx,new_vy,Q.front().steps+1));
  84.                             visited[new_x][new_y][new_vx+3][new_vy+3]=true;
  85.                             }
  86.                         else if(map[new_x][new_y]=='Z') return Q.front().steps+1;
  87.                         }  
  88.                     }
  89.                 }
  90.             }
  91.             Q.pop();
  92.         }
  93.     return -1;
  94.     }
  95.  
  96. int main()
  97.     {
  98.     int testCount;
  99.     scanf("%d", &testCount);
  100.     while(testCount--) printf("%d\n",pogoRace());
  101.     return 0;
  102.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement