Pagini recente » Cod sursa (job #761120) | Cod sursa (job #876027) | Cod sursa (job #1929218) | Cod sursa (job #2154427) | Cod sursa (job #2657219)
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
queue<pair<int, int> > TEO;
int n, i, r, j, c, a[1005][1005], x1, x2, y11, y2,mx,rez;
int b[1005][1005];
char ca;
int linie, coloana, linienoua, coloananoua, k;
int dx[4] = { -1, 0, 1, 0 };
int dy[4] = { 0, -1, 0, 1 };
ifstream in ("barbar.in");
ofstream out ("barbar.out");
void afis()
{
for (int i = 0; i <= r+1; ++i)
{
for (int j = 0; j <= c+1; ++j)
out << a[i][j] << " ";
out << "\n";
}
}
int drum (int x)
{
memset(b, 0, sizeof(b));
while(TEO.empty()==0)
{
TEO.pop();
}
if(a[x1][y11] >= x)
TEO.push(make_pair(x1, y11));
while (TEO.empty() == 0)
{
linie = TEO.front().first;
coloana = TEO.front().second;
b[linie][coloana] = 1;
if(b[x2][y2]==1)
return 1;
for (k = 0; k < 4; k++)
{
linienoua = linie + dx[k];
coloananoua = coloana + dy[k];
if (a[linienoua][coloananoua] >= x && !b[linienoua][coloananoua])
{
TEO.push(make_pair(linienoua, coloananoua));
}
}
TEO.pop();
}
return b[x2][y2];
}
int main()
{
in >> r >> c;
for (i = 1; i <= r; i++)
{
for (j = 1; j <= c; j++)
{
in >> ca;
if (ca == '.')
a[i][j] = 0;
else if (ca == '*')
a[i][j] = -2;
else if (ca == 'D')
{
a[i][j] = 1;
TEO.push(make_pair(i, j));
}
else if (ca == 'I')
{
x1 = i;
y11 = j;
}
else if (ca == 'O')
{
x2 = i;
y2 = j;
}
}
}
for (j = 1; j <= c + 1; j++)
{
a[0][j] = -2;
a[r + 1][j] = -2;
}
for (i = 1; i <= r + 1; i++)
{
a[i][c + 1] = -2;
a[i][0] = -2;
}
while (TEO.empty() == 0)
{
linie = TEO.front().first;
coloana = TEO.front().second;
for (k = 0; k < 4; k++)
{
linienoua = linie + dx[k];
coloananoua = coloana + dy[k];
if (linienoua > 0 && linienoua <= r && coloananoua > 0 && coloananoua <= c && a[linienoua][coloananoua] == 0)
{
a[linienoua][coloananoua] = a[linie][coloana] + 1;
TEO.push(make_pair(linienoua, coloananoua));
}
}
TEO.pop();
}
for (int i = 1; i <= r; ++i)
for (int j = 1; j <= c; ++j)
if (a[i][j] > 0)
a[i][j] -= 1;
for(int i=1;i<=r;i++)
{
for (int j=1;j<=c;j++)
{
if(a[i][j]>mx)
mx=a[i][j];
}
}
int st=1,dr=mx;
rez = -1;
//out << st << " " << dr<<"\n";
while(st<=dr)
{
int mij=(st+dr)/2;
if(drum(mij)!=0)
{
st=mij+1;
rez=mij;
}
else
{
dr=mij-1;
}
}
out<<rez<<"\n";
//afis();
/*out << a[x2][y2] << '\n';
for (i = 1; i <= r; i++)
{
for (j = 1; j <= c; j++)
{
out << a[i][j] << ' ';
}
out << '\n';
}*/
return 0;
}