Pagini recente » Cod sursa (job #166143) | Cod sursa (job #770726) | Cod sursa (job #631632) | Cod sursa (job #1411426) | Cod sursa (job #3138564)
#include <fstream>
#include <queue>
#include <string>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
int n, m;
int v[1001][1001];
int c[1001][1001];
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
struct coord{
int lin, col;
};
queue < coord > q;
coord st;
coord fin;
coord dragon;
string s;
bool inmat(coord cur)
{
return cur.lin >= 1 && cur.lin <= n && cur.col >= 1 && cur.col <= m;
}
void copiere()
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
c[i][j] = v[i][j];
}
}
}
int lee(coord st, coord fin)
{
c[st.lin][st.col] = 1;
q.push(st);
while(!q.empty())
{
coord cur = q.front();
q.pop();
coord vecin;
for(int d = 0; d < 4; d++)
{
vecin.lin = cur.lin + dir[d][0];
vecin.col = cur.col + dir[d][1];
if(inmat(vecin) && c[vecin.lin][vecin.col] == 0)
{
c[vecin.lin][vecin.col] = c[cur.lin][cur.col] + 1;
q.push(vecin);
}
}
}
return c[fin.lin][fin.col];
}
void lee2(coord st, int fin)
{
q.push(st);
while(!q.empty())
{
coord cur = q.front();
q.pop();
coord vecin;
for(int d = 0; d < 4; d++)
{
vecin.lin = cur.lin + dir[d][0];
vecin.col = cur.col + dir[d][1];
if(inmat(vecin) && c[vecin.lin][vecin.col] == 0 && c[cur.lin][cur.col] > -2 - fin)
{
c[vecin.lin][vecin.col] = c[cur.lin][cur.col] - 1;
q.push(vecin);
}
}
}
}
int caut_binar(int stg, int dr)
{
int ans = 0;
while(stg <= dr)
{
int mij = (stg + dr) / 2;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
if(c[i][j] == -2)
{
dragon.lin = i;
dragon.col = j;
lee2(dragon, mij);
}
}
}
int final = lee(st, fin);
if(final > 0)
{
ans = mij;
stg = mij + 1;
}
else if(final <= 0)
{
dr = mij - 1;
}
copiere();
}
if(ans != 0)
{
return ans;
}
else
{
return -1;
}
}
int main()
{
cin >> n >> m;
getline(cin, s);
for(int i = 1; i <= n; i++)
{
getline(cin, s);
for(int j = 0; j < m; j++)
{
if(s[j] == 'I')
{
st.lin = i;
st.col = j + 1;
}
else if(s[j] == 'D')
{
v[i][j + 1] = -2;
}
else if(s[j] == '*')
{
v[i][j + 1] = -1;
}
else if(s[j] == 'O')
{
fin.lin = i;
fin.col = j + 1;
}
}
s.clear();
}
copiere();
int ans = caut_binar(1, max(n, m)) + 1;
cout << ans << '\n';
return 0;
}