Advertisement
AlenAntonelli

Floodfill (BFS)

Jun 19th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.92 KB | None | 0 0
  1. ///Antonelli Alen
  2.  
  3. #include <iostream>
  4. #include <vector>
  5. #include <queue>
  6. #define INF (1<<29)
  7. using namespace std;
  8.  
  9. int dx[] = {0, 0, 1,-1};
  10. int dy[] = {1,-1, 0, 0};
  11.  
  12. struct grafo {
  13.     vector<string> ady;
  14.     vector< vector<int> > dist;
  15.     vector< pair<int,int> > ini;
  16.     queue< pair<int,int> > cola;
  17.     int n, m, p;
  18.    
  19.     void leer()
  20.     {
  21.         cin>>n>>m;
  22.        
  23.         ady.resize(n);
  24.         dist = vector< vector<int> > (n+1, vector<int> (m, INF) );
  25.        
  26.         for(int i=0; i<n; i++)
  27.             cin>>ady[i];
  28.     }
  29.    
  30.     bool visitable (int x, int y)
  31.     {
  32.         if ((0<=x && x<n) && (0<=y && y<m) )
  33.             if( ady[x][y]!='#' )
  34.                 return true;
  35.         return false;
  36.     }
  37.    
  38.     void BFS ()
  39.     {
  40.         for(int i=0; i<n; i++) /// laterales
  41.         {
  42.             if ( visitable(i, 0) )
  43.                 ini.push_back( {i,0} );
  44.             if ( visitable(i, m-1) )
  45.                 ini.push_back( {i,m-1} );
  46.         }
  47.        
  48.         for(int i=0; i<m; i++) /// superior inferior
  49.         {
  50.             if ( visitable(0, i) )
  51.                 ini.push_back( {0,i} );
  52.             if ( visitable(n-1,i) )
  53.                 ini.push_back( {n-1,i} );
  54.         }
  55.        
  56.         for(int i=0; i<ini.size(); i++)
  57.         {
  58.             int x = ini[i].first;
  59.             int y = ini[i].second;
  60.            
  61.             dist[x][y] = 0;
  62.             cola.push( ini[i] );
  63.         }
  64.        
  65.         while(cola.size())
  66.         {
  67.             int x = cola.front().first;
  68.             int y = cola.front().second;
  69.             cola.pop();
  70.            
  71.             for(int i=0; i<4; i++)
  72.             {
  73.                 int vx = x+dx[i];
  74.                 int vy = y+dy[i];
  75.                
  76.                 if ( visitable(vx,vy) )
  77.                     if ( dist[x][y]+1 < dist[vx][vy] )
  78.                     {
  79.                         dist[vx][vy] = dist[x][y]+1;
  80.                         cola.push( {vx,vy} );
  81.                     }
  82.             }
  83.         }
  84.        
  85.         for(int i=0; i<n; i++)
  86.         {
  87.             for(int j=0; j<m; j++)
  88.             {
  89.                 if (ady[i][j]=='#')
  90.                     cout<<"#  ";
  91.                 else if (dist[i][j]==INF)
  92.                     cout<<"N  ";
  93.                 else if (dist[i][j]>9)
  94.                     cout<<dist[i][j]<<" ";
  95.                 else
  96.                    cout<<dist[i][j]<<"  ";
  97.             }
  98.             cout<<endl;
  99.         }
  100.        
  101.         cin>>p;
  102.         int x, y;
  103.         for(int i=0; i<p; i++)
  104.         {
  105.             cin>>x>>y;
  106.             cout<<x<<" "<<y<<" -> ";
  107.             if(dist[x-1][y-1]==INF)
  108.                 cout<<"NO"<<endl;
  109.             else cout<<dist[x-1][y-1]<<endl;
  110.         }
  111.     }
  112. };
  113.  
  114. int main()
  115. {
  116.     grafo g;
  117.     g.leer();
  118.     g.BFS();
  119.  
  120.     return 0;
  121. }
  122.  
  123. /*
  124.  
  125. 6 10
  126. ##########
  127. ____###__#
  128. ____#_##_#
  129. ##__####_#
  130. #________#
  131. ##########
  132.  
  133. 4
  134. 1 1
  135. 5 2
  136. 4 9
  137. 3 6
  138.  
  139. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement