Pagini recente » Atasamentele paginii Happy Birthday Infoarena 2014 | Cod sursa (job #3300222) | Cod sursa (job #1529734) | Cod sursa (job #3194146) | Cod sursa (job #3300449)
#include <bits/stdc++.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
char matrix[1050][1050];
int distante[1050][1050];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int R,C;
pair<int,int> start,sf;
queue<pair<int,int>> Q;
void bordare(int n,int m)
{
for(int i=0;i<=n+1;i++)
matrix[i][0]=matrix[i][m+1]='/';
for(int i=0;i<=m+1;i++)
matrix[0][i]=matrix[n+1][i]='/';
}
int valid(int mind)
{
bool visited[1300][1300]={false};
if(distante[start.first][start.second]<mind)
return false;
Q.push({start.first,start.second});
visited[start.first][start.second]=true;
while(!Q.empty())
{
pair<int,int> curr = Q.front();
Q.pop();
if(curr.first==sf.first && curr.second==sf.second)
return true;
for(int i=0;i<4;i++)
{
int vx=curr.first+dx[i];
int vy=curr.second+dy[i];
if(matrix[vx][vy]!='/' && matrix[vx][vy]!='*' && distante[vx][vy]>=mind
&& visited[vx][vy]==false && distante[vx][vy]!=1e9 && matrix[vx][vy] != 'D')
{
Q.push({vx,vy});
visited[vx][vy]=true;
}
}
}
return false;
}
void runlee()
{
for(int i=1;i<=R;i++)
for(int j=1;j<=C;j++)
distante[i][j]=1e9;
while(!Q.empty())
{
pair<int,int> curr = Q.front();
Q.pop();
if(matrix[curr.first][curr.second]=='D')
distante[curr.first][curr.second]=0;
for(int i=0;i<4;i++)
{
int vx=curr.first+dx[i];
int vy=curr.second+dy[i];
if(matrix[vx][vy]!='/' && matrix[vx][vy]!='*' &&
distante[vx][vy]>distante[curr.first][curr.second]+1)
{
distante[vx][vy]=distante[curr.first][curr.second]+1;
Q.push({vx,vy});
}
}
}
}
int main()
{
f>>R>>C;
int st=1,dr=R*C,result=-1;
for(int i=1;i<=R;i++)
{
string s;
f>>s;
for(int j=1;j<=C;j++)
{
matrix[i][j]=s[j-1];
if(matrix[i][j]=='I')
start.first=i,start.second=j;
if(matrix[i][j]=='O')
sf.first=i,sf.second=j;
if(matrix[i][j]=='D')
Q.push({i,j});
}
}
bordare(R,C);
runlee();
while(st<=dr)
{
int m=(st+dr)/2;
if(valid(m))
{
result = m;
st=m+1;
}
else
dr=m-1;
}
g<<0;
return 0;
}