Advertisement
saske_7

jane and frost giant.cpp

Dec 22nd, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.64 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define bound(x,y , i , j) x >= 0 && x < i && y >= 0 && y < j
  6. #define mp make_pair
  7. #define pb push_back
  8. #define pii pair<int , int>
  9. #define M 205
  10. #define rep(i , n) for(i = 0 ; i< n ;i++ )
  11. #define repi(i , n ) for(i = 0 ; i<= n ; i++ )
  12. #define mem(x , y ) memset(x , y , sizeof x )
  13. #define mx 5000000
  14.  
  15. int dx[] = { -1 ,+1, 0 , 0 };
  16. int dy[] = { 0 , 0, +1, -1 };
  17.  
  18. int m[M+5][M+5]  ,vis[100000]  , dis[100000];
  19. char str[M+5][M+5] ;
  20.  
  21. vector<int> g[100000];
  22. vector<int > fire ;
  23.  
  24. void clr(){
  25. int i ;
  26.     fire.clear();
  27.     rep(i , mx) g[i].clear();
  28.     mem(vis ,-1);
  29.     mem(dis , 100000);
  30.  
  31. }
  32.  
  33. void bfsj(int start ){
  34. int i , j , k ,  count = 1 ;
  35.  
  36. queue<int >q ;
  37.     mem(vis , -1 );
  38.     vis[start] = 0 ;
  39.     dis[start] = 0 ;
  40.     q.push(start );
  41.    
  42.     while(!q.empty() ){
  43.  
  44.     k = q.front();
  45.     if(k == 1 ) return ;
  46.     //if(tag == 1 && k == 1 ) return ;
  47.     q.pop();
  48.     for(i = 0 ;i < g[k].size() ; i++ ){
  49.         j = dis[k ] +1 ;
  50.         if( vis[g[k][i] ] == -1 && j < dis[ g[k][i] ] ){
  51.  
  52.                 dis[g[k][i]] = j ;
  53.                 vis[g[k][i]] = 1;
  54.  
  55.                 q.push(g[k][i]);
  56.             }
  57.         }
  58.     }
  59. return ;
  60.  
  61. }
  62.  
  63. void bfsf( ){
  64.  
  65. int i , j , k ,  count = 1 ;
  66. queue<int >q ;
  67.     mem(dis , 0 );
  68.   mem(vis , -1 );
  69.  
  70.     rep( i , fire.size() ) {
  71.         vis[fire[i] ] = 1 ;
  72.         q.push(fire[i] );
  73.     }
  74.  
  75.     while(!q.empty() ){
  76.  
  77.     k = q.front();
  78.     //if(tag == 1 && k == 1 ) return ;
  79.     q.pop();
  80.     for(i = 0 ;i < g[k].size();i++){
  81.  
  82.         if(vis[g[k][i] ] == -1 ){
  83.  
  84.                 dis[g[k][i]] = dis[k] + 1;
  85.                 vis[g[k][i]] = 1;
  86.  
  87.                 q.push(g[k][i]);
  88.             }
  89.         }
  90.     }
  91. return ;
  92. }
  93.  
  94.  
  95. int main(){
  96.  // freopen("in.txt" ,"r",stdin );
  97.  
  98. int i , j , k ,tc , cs = 0;
  99. scanf("%d",&tc);
  100.  
  101.     while(tc--){
  102.  
  103.     int r , c , qr , count = 0 , start ;
  104.  
  105.     clr();
  106.     scanf("%d%d",&r , &c);   qr = r ;
  107.     getchar();
  108.     rep(i , qr) gets(str[i] );
  109.  // printf("hello");
  110.  
  111.  
  112.     repi(i , c +1) { m[0][i] = m[r+1][i] = 1 ; }
  113.     repi(i , r +1) { m[i][0] = m[c+1][0] = 1 ; }
  114.     count = 2;
  115.  
  116.     rep(i, r ) rep(j , c ) m[i+1][j+1] = count++;
  117.     rep(i , r ) rep( j , c){
  118.  
  119.         if(str[i][j] == 'F'){
  120.             fire.pb(m[i+1][j+1] );
  121.  
  122.         }
  123.         if(str[i][j] == 'J'){
  124.             start =  m[i+1][j+1];
  125.  
  126.         }
  127.  
  128.         if(str[i][j] == '#' ){
  129.         continue;
  130.  
  131.         }
  132.  
  133.         rep(k  , 4 ){
  134.             int x = i+dx[k];
  135.             int y = j+dy[k];
  136.             if(str[x][y] == '#' ) continue;
  137.  
  138.             if(x >= 0 && x < r &&  y>= 0 && y < c )
  139.             {
  140.  
  141.                 g[m[i+1][j+1]].pb(m[x+1][y+1] );
  142.  
  143.  
  144.             }
  145.             else
  146.             {
  147.                 g[m[i+1][j+1]].pb(1 );
  148.             }
  149.         }
  150.     }
  151.  
  152.     bfsf();
  153.     dis[1] = 10000000 ;
  154.  
  155.     bfsj(start );
  156.  
  157.     if(dis[1] != 10000000 )
  158.         printf("Case %d: %d\n",++cs, dis[1]);
  159.     else
  160.         printf("Case %d: IMPOSSIBLE\n",++cs);
  161.     }
  162.  
  163. return 0 ;
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement