Pagini recente » Cod sursa (job #3157346) | Cod sursa (job #559503) | Cod sursa (job #1692736) | Cod sursa (job #7663) | Cod sursa (job #2911272)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m;
int ca[105][105];
char a[105][105];
int sol;
int sti, stj, opi, opj;
queue < pair < int, int> > Q;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
// -1 perete 0 drum E iesire
void read()
{
fin >> n >> m;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
{
fin >> a[i][j];
if(a[i][j] == '.')
ca[i][j] = -2;
if(a[i][j] == 'I')
{
ca[i][j] = -3;
sti = i;
stj = j;
}
if(a[i][j] == '*')
ca[i][j] = -1;
if(a[i][j] == 'D')
{
Q.push(make_pair(i, j));
ca[i][j] = 0;
}
if(a[i][j] == 'O')
{
ca[i][j] = -4;
opi = i;
opj = j;
}
}
}
bool valid(int i, int j)
{
return (i > 0 && i <= n && j > 0 && j <= m && ca[i][j] != -1);
}
void Lee()
{
while(!Q.empty())
{
int l = Q.front().first;
int c = Q.front().second;
Q.pop();
for(int i = 0; i < 4; i ++)
{
int lin = dx[i] + l;
int col = dy[i] + c;
if(valid(lin, col) && ca[lin][col] == -2)
{
ca[lin][col] = ca[l][c] + 1;
Q.push(make_pair(lin, col));
}
}
}
}
void afis()
{
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= m; j ++)
cout << ca[i][j] << " ";
cout << endl;
}
}
void Fill(int i, int j, int x) ///parcurgi matricea pe elemente mai mari sau egale cu x
{
if(valid(i, j) && (ca[i][j] >= x || ca[i][j] == -3 || ca[i][j] == -4))
{
ca[i][j] = -5;
for(int k = 0; k < 4; k ++)
Fill(i + dx[k], j + dy[k], x);
}
}
///daca pot ajunge de la i la O mergand doar pe ca[tx][ty] >= x
bool Check(int x)
{
Fill(sti, stj, x);
if(ca[opi][opj] == -5)
return true;
return false;
}
void cpy(int A[][105], int B[][105])
{
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
A[i][j] = B[i][j];
}
int main()
{
read();
Lee();
// afis();
// cout << endl;
int copie[105][105];
cpy(copie, ca);
int st = 1, dr = n * m, mij, val = 0;
while(st <= dr)
{
mij = (st + dr) / 2;
if(Check(mij))
{
st = mij + 1;
val = mij;
}
else
dr = mij - 1;
cpy(ca, copie);
}
fout << val;
return 0;
}