Cod sursa(job #2208495)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 30 mai 2018 07:32:00
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <queue>
#include <fstream>
#include <iostream>
#include <tuple>

using namespace std;

ifstream fin ("barbar.in");
ofstream fout ("barbar.out");

const int Dim = 1001, Inf = 0x3f3f3f3f;
const int di[] = {1,-1,0,0}, dj[]={0,0,1,-1};
int  B[Dim][Dim],C[Dim][Dim],n,k,m,si,sj,fi,fj;
char O[Dim][Dim];
pair < int , int > D[Dim];
queue <  pair  < int, int > >  Q;

void LeeD() ;
void Lee();

int main() {

	fin >> n >> m;
	fin.get();
	for ( int i = 1; i <= n; ++i){
		fin >> (O[i] + 1);
		for ( int j = 1 ; j <= m; ++j) {
			if ( O[i][j] == 'D')
				D[++k] = { i, j};
			else
				if ( O[i][j] == 'I' )
					si = i , sj = j;
			else
				if ( O[i][j] == 'O' )
					fi = i, fj = j;
			B[i][j] = Inf;
			C[i][j] = -1;
			}
    }
	for ( int i = 1; i <= k; ++i) {
		B[D[i].first][D[i].second] = 0;
		Q.push({D[i].first, D[i].second});
		}
	LeeD();
	Lee();
    fout << C[fi][fj];

}

bool OK(int i , int j){
    return 1 <= i and i <= n and 1 <= j and j <= m and O[i][j] == '.';
}


void LeeD() {

	int i,j;
	while(! Q.empty() ) {
		tie(i,j) = Q.front();
		Q.pop();
		for ( int x = 0; x < 4; ++x)
			if ( OK(i + di[x], j + dj[x] ) and B[i][j] + 1 < B[i + di[x]][j + dj[x]] ) {
				B[i + di[x]][j + dj[x]] =  B[i][j] + 1;
				Q.push({i + di[x] , j + dj[x]} );
				}

	}
}

void Lee() {

	int i,j;

	Q.push({si,sj});
	C[si][sj] = B[si][sj];
	while(! Q.empty() ) {
		tie(i,j) = Q.front();
		Q.pop();
		for ( int x = 0; x < 4; ++x)
			if ( OK(i + di[x], j + dj[x] ) and C[i][j] > C[i + di[x]][j + dj[x]] ) {
				C[i + di[x]][j + dj[x]] =  min(C[i][j], B[i+di[x]][j+dj[x]]);
				Q.push({i + di[x] , j + dj[x]} );
				}
	}
}