Pagini recente » Cod sursa (job #55945) | Sedinta 2008-11-25 | Cod sursa (job #1423168) | Cod sursa (job #1514004) | Cod sursa (job #3256049)
#include<fstream>
#include<queue>
#include<string>
#define INF 2000000000
std::ifstream fin("barbar.in");
std::ofstream fout("barbar.out");
int n, m;
int mat[1010][1010];//matricea cu distantele reale de la dragoni
int sol[1010][1010];
bool maze[1010][1010];
int iS, jS, iE, jE;
inline bool inmat(int i, int j)
{
return (i>=0 && i<n && j>=0 && j<m);
}
int di[]={-1, 0, 1, 0}, dj[]={0, -1, 0, 1};
void read()
{
std::fill(sol[0], sol[1009]+1009, -1);
std::fill(mat[0], mat[1009]+1009, INF);
fin>>n>>m;
std::queue<std::pair<int, int>>q;
for(int i=0; i<n; ++i)
{
std::string line;
fin>>line;
for(int j=0; j<m; ++j)
{
if(line[j]=='I')
iS=i, jS=j, maze[i][j]=true;
else if(line[j]=='O')
iE=i, jE=j, maze[i][j]=true;
else if(line[j]=='D')
{
q.emplace(i, j);
mat[i][j]=0;
}
else if(line[j]=='.')
maze[i][j]=true;
}
}
while(!q.empty())
{
int i=q.front().first, j=q.front().second;
q.pop();
for(int k=0; k<4; ++k)
{
int I=i+di[k], J=j+dj[k];
if(inmat(I, J) && maze[I][J])
if(mat[I][J]>mat[i][j]+1)
{
mat[I][J]=mat[i][j]+1;
q.emplace(I, J);
}
}
}
}
void solve()
{
std::priority_queue<std::pair<int, std::pair<int, int>>>pq;
pq.push({mat[iS][jS], {iS, jS}});
while(!pq.empty())
{
int dist=pq.top().first;
int i=pq.top().second.first, j=pq.top().second.second;
pq.pop();
for(int k=0; k<4; ++k)
{
int I=i+di[k], J=j+dj[k];
if(inmat(I, J) && maze[I][J])
{
int newDist=std::min(dist, mat[I][J]);
if(newDist>sol[I][J])
{
sol[I][J]=newDist;
pq.push({newDist, {I, J}});
}
}
}
}
fout<<sol[iE][jE];
}
int main()
{
read();
/*for(int i=0; i<n; ++i)
{
for(int j=0; j<m; ++j)
fout<<mat[i][j]<<' ';
fout<<'\n';
}*/
solve();
return 0;
}