Pagini recente » Cod sursa (job #2665945) | Cod sursa (job #2224669) | Cod sursa (job #1255910) | Cod sursa (job #1684806) | Cod sursa (job #2033577)
#include <iostream>
#include <fstream>
#include <queue>
#define NMAX 1005
#define INF 0x3f3f3f3f
using namespace std;
ifstream fi("barbar.in");
ofstream fo("barbar.out");
void input();
void output();
int diri[] = {-1, 0, 1, 0};
int dirj[] = { 0, 1, 0, -1};
int dragon[NMAX][NMAX];
bool parcur[NMAX][NMAX];
int xStart, yStart, xFinish, yFinish;
int N, M;
queue<pair<int,int> > q;
bool check(int i,int j)
{
return (i>=1 && i<=N && j>=1 && j<=M && dragon[i][j] != -1);
}
void setDragonParameters()
{
while(!q.empty())
{
int i = q.front().first;
int j = q.front().second;
q.pop();
for(int k=0; k<4; ++k)
{
int ii = i + diri[k];
int jj = j + dirj[k];
if(check(ii,jj))
{
if(dragon[ii][jj]> dragon[i][j]+1)
{
dragon[ii][jj] = dragon[i][j]+1;
q.push({ii,jj});
}
}
}
}
}
bool lee(int cost)
{
while(!q.empty()) q.pop();
for(int i=1; i<=N; ++i)
{
for(int j=1; j<=M; ++j)
{
parcur[i][j]=0;
}
}
if(cost<= dragon[xStart][yStart])
q.push({xStart,yStart});
while(!q.empty())
{
int i = q.front().first;
int j = q.front().second;
q.pop();
for(int k=0; k<4; ++k)
{
int ii = i + diri[k];
int jj = j + dirj[k];
if(cost<= dragon[ii][jj] && check(ii,jj) && !parcur[ii][jj] && dragon[ii][jj]!=0)
{
q.push({ii,jj});
parcur[ii][jj]=1;
if(ii == xFinish && jj == yFinish)
{
return 1;
}
}
}
}
return 0;
}
int main()
{
input();
setDragonParameters();
int dr = 1000, st = 0, mid;
while(dr-st >1)
{
mid = (dr+st)/2;
int s = lee(mid);
if(s) st = mid;
else dr = mid;
}
fo<<mid;
}
void input()
{
fi>>N>>M;
char c;
for(int i=1; i<=N; ++i)
{
for(int j=1; j<=M; ++j)
{
dragon[i][j] = INF;
}
}
for(int i=1; i<=N; ++i)
{
for(int j=1; j<=M; ++j)
{
fi>>c;
if(c == 'I')
{
xStart = i;
yStart = j;
}
else if(c == 'D')
{
q.push({i,j});
dragon[i][j] = 0;
}
else if(c == '*')
{
dragon[i][j] = -1;
}
else if( c == 'O')
{
xFinish = i;
yFinish = j;
}
}
}
}