Advertisement
saske_7

fire.cpp

Nov 16th, 2017
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.01 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define M 1015
  5. #define pii pair<int , int >
  6. #define mp make_pair
  7. #define pf printf
  8. #define sf scanf
  9. #define sf1(a ) scanf("%d",&a)
  10. #define pb push_back
  11. #define sf2(a, b) scanf("%d%d",&a ,&b)
  12. #define rep(i,n) for(i = 0 ; i< n ;i++ )
  13.  
  14. const int mx =  10000000;
  15. vector<int > g[500000];
  16.  
  17. struct _node
  18. {
  19.     int x, y ;
  20.  
  21. } var[100000];
  22.  
  23. struct _fire
  24. {
  25.     int x, y ;
  26.  
  27. };
  28.  
  29. struct _me
  30. {
  31.     int x, y ;
  32. };
  33.  
  34. vector<_fire > fire;
  35.  
  36. queue<int> q;
  37. vector<_me > me ;
  38.  
  39. int arr[M][M], m_arr[M][M];
  40. int dist[1000000], vis[10000000];
  41.  
  42. int bfs(int start, int tag);
  43.  
  44. int main()
  45. {
  46.     freopen("in.txt","r",stdin);
  47.     freopen("out.txt","w",stdout);
  48.  
  49.     int i, j, k,tc ;
  50.     int cs  = 0;
  51.     sf1(tc );
  52.     while(tc--)
  53.     {
  54.         ++cs;
  55.         int row, col, len;
  56.  
  57.         char str[M][M];
  58.  
  59.         rep(i, 500000)g[i].clear();
  60.  
  61.         fire.clear();
  62.         me.clear();
  63.  
  64.         scanf("%d%d",&row,&col );
  65.         getchar();
  66.  
  67.         for(i = 0 ; i< row ; i++)
  68.             gets(str[i]);
  69.         for(i = 0 ; i< row ; i++)
  70.         {
  71.             for(j = 0 ; j< col ; j++)
  72.             {
  73.                 if(str[i][j] == '#') arr[i+1][j+1] = 4;
  74.                 else if(str[i][j] == '.') arr[i+1][j+1] = 1;
  75.                 else if(str[i][j] == 'F')
  76.                 {
  77.                     arr[i+1][j+1] = 1;
  78.                     _fire pv ;
  79.                     pv.x = i+1 ;
  80.                     pv.y  = j +1;
  81.  
  82.                     fire.pb(pv);
  83.                 }
  84.                 else if(str[i][j] == 'J')
  85.                 {
  86.                     _me pj;
  87.                     pj.x = i+1 ;
  88.                     pj.y =  j +1;
  89.                     me.pb(pj);
  90.                     arr[i+1][j+1] = 1;
  91.  
  92.                 }
  93.             }
  94.         }
  95.  
  96.         int count = 1;
  97.         _node ob;
  98.         for(i = 0 ; i<= col+2 ; i++)
  99.         {
  100.             m_arr[0][i] = 0 ;
  101.             m_arr[row+1][i] = 0 ;
  102.  
  103.         }
  104.  
  105.         for(i = 0 ; i<=row+2; i++)
  106.         {
  107.             m_arr[i][0] = 0 ;
  108.             m_arr[i][col+1 ] = 0 ;
  109.  
  110.         }
  111.  
  112.         for(i = 1 ; i<=  row ; i++)
  113.         {
  114.             for(j=1 ; j<= col ; j++)
  115.             {
  116.                 m_arr[i][j] = count;
  117.                 var[count].x =i ;
  118.                 var[count++].y = j;
  119.  
  120.  
  121.  
  122.             }
  123.         }
  124.         /*pf("ho ho ho,,");
  125.         rep(i , row+2){
  126.           rep(j , col+2 )
  127.           pf("%d ",m_arr[i][j]);
  128.           pf("\n");
  129.         }
  130.  
  131.         /*/
  132.  
  133.         for(i = 1 ; i<=  row ; i++)
  134.         {
  135.             for(j=1 ; j<= col ; j++)
  136.             {
  137. //        pf("%d %d-----> ",arr[i][j] , m_arr[i][j]);
  138.                 //        pf("%d %d\n", i , j);
  139.                 if(arr[i][j] == 4) continue;
  140.  
  141.                 if(arr[i-1][j] == 1 || arr[i-1][j] == 0 )
  142.                     g[m_arr[i][j]].pb(m_arr[i-1][j]);
  143.  
  144.                 if(arr[i+1][j] == 1 || arr[i+1][j] == 0 )
  145.                     g[m_arr[i][j]].pb(m_arr[i+1][j]);
  146.  
  147.                 if(arr[i][j+1] == 1 || arr[i][j+1] == 0 )
  148.                     g[m_arr[i][j]].pb(m_arr[i][j+1]);
  149.  
  150.                 if(arr[i][j-1] == 1 || arr[i][j-1] == 0 )
  151.                     g[m_arr[i][j]].pb(m_arr[i][j-1]);
  152.  
  153.             }
  154.         }
  155.         /*
  156.             rep(i , row ){
  157.               rep(j , col)
  158.               {
  159.                 k = m_arr[ i+1][j+1];
  160.                 pf("%d(%d %d) -> ",k , var[k].x, var[k].y );
  161.                 for(int u = 0 ; u < g[k].size() ; u++)
  162.                   pf("%d ",g[k][u]);
  163.                   pf("\n");
  164.               }
  165.             }
  166.           */
  167.         rep(i,M ) dist[i] = mx;
  168.         for(i = 0 ; i< fire.size(); i++)
  169.         {
  170.             k =  bfs(m_arr[fire[i].x][fire[i].y], 2);
  171.  
  172.         }
  173.  
  174.         dist[0] =  mx ;
  175.         dist[m_arr[me[0].x][me[0].y]] =  0 ;
  176.         ++cs;
  177.  
  178.         k = bfs(m_arr[me[0].x][me[0].y], 10);
  179.         // bfs();
  180.         if(k==  mx )
  181.             pf("IMPOSSIBLE\n");
  182.         else
  183.             pf("%d\n",dist[0]);
  184. rep(i ,500000) g[i].clear();
  185. }
  186.     return 0 ;
  187. }
  188.  
  189. int bfs(int start, int tag)
  190. {
  191.     int i, j,k ;
  192.     if(!q.empty()) while(!q.empty()) q.pop();
  193.  
  194.     dist[start] = 0;
  195.     dist[0] = mx;
  196.  
  197.     q.push(start);
  198.     memset(vis, -1, sizeof vis );
  199.  
  200.     vis[start] = 1 ;
  201. // pf("%d %d\n", start , dist[start]);
  202.  
  203.     int flag = 0;
  204.  
  205.     while(!q.empty())
  206.     {
  207.         k = q.front();
  208.         q.pop();
  209.         for(i = 0 ; i< g[k].size() ; i++)
  210.         {
  211.             if(vis[g[k][i] ] == -1)
  212.             {
  213.                 vis[g[k][i] ] =  1;
  214.  
  215.                 if(dist[g[k][i] ] > dist[k]+1)
  216.                 {
  217.                     if(tag == 10)
  218.                         //pf("val %d %d\n",k, dist[k]);
  219.                         dist[g[k][i]] =  dist[k] +1 ;
  220.                     if(tag ==  10 && g[k][i] == 0)
  221.                     {
  222.                         flag =1 ;
  223.                         break ;
  224.                     }
  225.                     q.push(g[k][i]);
  226.                 }
  227.             }
  228.         }
  229.         if(flag ==1 ) break ;
  230.     }
  231.     return dist[0];
  232. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement