Pagini recente » Cod sursa (job #941548) | Cod sursa (job #1910191) | Cod sursa (job #2100279) | Cod sursa (job #928477) | Cod sursa (job #1623017)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int map[1001][1001],mapdis[1001][1001],mapparc[1001][1001],distmax;
char cit;
int x1,y1,x2,y2;
int stx[1000001],sty[1000001],stdist[1000001],k,curr=1;
int dx[5]={0,-1,0,1,0},dy[5]={0,0,1,0,-1};
int min(int a,int b)
{
if (a>b) return b;
return a;
}
int main()
{
int n,m;
f>>n>>m>>ws;
for(int i=1;i<=n;i++)
{ for(int j=1;j<=m;j++)
{
f>>cit;
if(cit=='.') map[i][j]=1;
if(cit=='I') {x1=i; y1=j;}
if(cit=='O') {x2=i; y2=j; map[i][j]=1;}
if(cit=='D') {k++; stx[k]=i; sty[k]=j; stdist[k]=1; mapdis[i][j]=1;}
} f>>ws; }
while(curr<=k)
{
for(int i=1;i<=4;i++)
if(!mapdis[stx[curr]+dx[i]][sty[curr]+dy[i]])
{
k++;
mapdis[stx[curr]+dx[i]][sty[curr]+dy[i]]=stdist[curr]+1;
stdist[k]=stdist[curr]+1;
stx[k]=stx[curr]+dx[i];
sty[k]=sty[curr]+dy[i];
}
curr++;
}
k=1;
curr=1;
stx[k]=x1;
sty[k]=y1;
stdist[k]=mapdis[x1][y1];
distmax=0;
mapparc[x1][y1]=mapdis[x1][y1];
while(curr<=k)
{
if((stx[curr]==x2) && (sty[curr]==y2))
{
if(stdist[curr]>distmax) distmax=stdist[curr];
}
for(int i=1;i<=4;i++)
if((stdist[curr]>mapparc[stx[curr]+dx[i]][sty[curr]+dy[i]]) && (map[stx[curr]+dx[i]][sty[curr]+dy[i]]))
{
mapparc[stx[curr]+dx[i]][sty[curr]+dy[i]]=stdist[curr];
k++;
stx[k]=stx[curr]+dx[i];
sty[k]=sty[curr]+dy[i];
stdist[k]=min(stdist[curr],mapdis[stx[curr]+dx[i]][sty[curr]+dy[i]]);
}
curr++;
}
g<<distmax-1;
return 0;
}