Cod sursa(job #778244)

Utilizator thesilverhand13FII Florea Toma Eduard thesilverhand13 Data 14 august 2012 12:54:34
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.32 kb
 # include <fstream>
 # include <cstring>
 # include <algorithm>
 # include <vector>
 # include <queue>
 
 # define dim 1005
 # define inf 999999999
 
 using namespace std;
 
 ifstream f("barbar.in");
 ofstream g("barbar.out");
 
 int n, m;
 int a[ dim ][ dim ], b[ dim ][ dim ];
 int inx, iny;
 int fx, fy;
 int sol = -1;
 
 int dx[]={1,0,-1,0};
 int dy[]={0,1,0,-1};
 
 struct coada
 {
	 int X, Y;
 };
 
 queue < coada > q, q2;
 
 void citire()
 {
	 int i, j;
	 char var;
	 coada u;
	 
	 f >> n >> m;
	 f.get();
	 
	 for ( i = 1 ; i <= n ; ++i )
	 {
		 for ( j = 1 ; j <= m ; ++j )
		 {
			 f >> var;
			 if ( var == '.')
				 a[ i ][ j ] = b[ i ][ j ] = inf;
			 else
			 if ( var == 'I')
				 inx = i, iny = j, a[ i ][ j ] = 0, b[ i ][ j ] = inf;
			 else
			 if ( var == 'D')
			 {
				 u.X = i;
				 u.Y = j;
				 q.push( u );
				 a[ i ][ j ] = -1;
			 }
			 else
			 if ( var == '*' )
				 a[ i ][ j ] = b[ i ][ j ] = -1;
			 else
			 if ( var == 'O' )
				 fx = i, fy = j, a[ i ][ j ] = inf, b[ i ][ j ] = inf;
		 }
	 }
 }
 
 
 void afisare()
 {
	 int i, j;
	 
	 for ( i = 1 ; i <= n ; i++ )
	 {
		 for ( j = 1 ; j <= m ; j++ )
			 g << a[ i ][ j ] << " ";
		 g << "\n";
	 }
 }
 
 
 void lee1()
 {
	 int x, y, xx, yy;
	 int i;
	 
	 coada var, var2;
	 
	 while( !q.empty() )
	 {
		 var = q.front();
		 x = var.X;
		 y = var.Y;
		 
		 for ( i = 0 ; i <= 3 ; ++i )
		 {
			 xx = x + dx[ i ];
			 yy = y + dy[ i ];
			 
			 if ( b[ xx ][ yy ] > b[ x ][ y ] + 1 && b[ x ][ y ] != -1 && xx >= 1 && yy >= 1 && xx <= n && yy <= m )
			 {
				 b[ xx ][ yy ] = b[ x ][ y ] + 1;
				 
				 var2.X = xx;
				 var2.Y = yy;
				 
				 q.push( var2 );
			 }
		 }
		 
		 q.pop();
	 }
 }
 
 
 void lee2( int val )
 {
	 int x, y, xx, yy;
	 int i;
	 int ok = 1;
	 
	 coada var, var2;
	 
	 while( !q.empty() )
	 {
		 var = q.front();
		 x = var.X;
		 y = var.Y;
		 
		 for ( i = 0 ; i <= 3 && ok == 1 ; ++i )
		 {
			 xx = x + dx[ i ];
			 yy = y + dy[ i ];
			 
			 if ( xx == fx && yy == fy )
				 ok = 0;
			 
			 if ( a[ xx ][ yy ] > a[ x ][ y ] + 1 && a[ x ][ y ] != -1 && b[ xx ][ yy ] >= val && xx >= 1 && yy >= 1 && xx <= n && yy <= m )
			 {
				 a[ xx ][ yy ] = a[ x ][ y ] + 1;
				 
				 var2.X = xx;
				 var2.Y = yy;
				 
				 q.push( var2 );
				 q2.push( var2 );
			 }
		 }
		 
		 
		 q.pop();
		 
		 if ( ok == 0 )
		 {
			 while( !q.empty() )
				 q.pop();
		 }
	 }
 }
 
 void init()
 {
	 coada var;
	 
	 while ( !q2.empty() )
	 {
		 var = q2.front();
		 
		 a[ var.X ][ var.Y ] = inf;
		 q2.pop();
	 }
	 
	 
	 //a[ fx ][ fy ] == inf;
 }

 
 inline bool verif( int x )
 {
	 coada var;
	 int ok;
	 
	 var.X = inx;
	 var.Y = iny;
	 
	 q.push( var );
	 
	 lee2( x );
	 
	  //afisare();
		// g << "\n";
	 
	 if ( a[ fx ][ fy ] != inf )
		 ok = 1;
	 else
		 ok = 0;
	 init();
	 return ok;
 }
 
 void cauta()
 {
	 int mid, st, dr;
	 st = 1, dr = dim * dim;
	 
	 while( st <= dr )
	 {
		 mid = ( st + dr ) / 2;
		 
		 if ( verif( mid ) == true )
			 st = mid + 1, sol = mid;
		 else
			 dr = mid - 1;
		
	 }
	 
	 g << sol;
	 
	 
 }
 
 void rezolva()
 {
	 lee1();
	 //afisare();
	 cauta();
 }
 
 int main()
 {
	 citire();
	 rezolva();
	 //afisare();
	 return 0;
 }