Pagini recente » Cod sursa (job #2695445) | Cod sursa (job #1242219) | Cod sursa (job #1702245) | Cod sursa (job #45732) | Cod sursa (job #718867)
Cod sursa(job #718867)
#include <fstream>
#include <queue>
#include <iomanip>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int di[]={1,-1,0,0};
const int dj[]={0,0,1,-1};
struct poz
{
int i;
int j;
poz()
{
i=j=0;
}
poz(int L, int C)
{
i=L;
j=C;
}
};
queue<poz> q;
queue<poz> vecin;
poz start,final;
int a[1001][1001],n,m;
bool mat[1001][1001];
bool inside(int i, int j)
{
return i>=1 && j>=1 && i<=n && j<=m;
}
int main()
{
int i,j,k;
char car;
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
fin>>car;
if(car=='*')
a[i][j]=-2;
else if(car=='D')
{
a[i][j]=1;
q.push(poz(i,j));
}
else if(car=='I')
{
start.i=i;
start.j=j;
}
else if(car=='O')
{
final.i=i;final.j=j;
}
}
/*while(!q.empty())
{
fout<<q.front().i<<' '<<q.front().j<<'\n';
q.pop();
}*/
while(!q.empty())
{
i=q.front().i;
j=q.front().j;
for(k=0;k<4;k++)
if(inside(i+di[k],j+dj[k]) && a[i+di[k]][j+dj[k]]==0)
{
q.push(poz(i+di[k],j+dj[k]));
a[i+di[k]][j+dj[k]]=a[i][j]+1;
}
q.pop();
}
/*for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
fout<<setw(2)<<a[i][j]<<' ';
fout<<'\n';
}
fout<<'\n';
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
fout<<setw(2)<<mat[i][j]<<' ';
fout<<'\n';
}*/
q.push(poz(start.i,start.j));
mat[start.i][start.j]=true;
poz maxpoz;
int dmin=a[start.i][start.j];
bool gasit=false;
while(!gasit)
{
while(!q.empty() && !gasit)
{
i=q.front().i;
j=q.front().j;
for(k=0;k<4;k++)
{
if(inside(i+di[k],j+dj[k]) && a[i+di[k]][j+dj[k]]>1 &&a[i+di[k]][j+dj[k]]>=dmin && mat[i+di[k]][j+dj[k]]==false)
{
q.push(poz(i+di[k],j+dj[k]));
mat[i+di[k]][j+dj[k]]=true;
if(i+di[k]==final.i && j+dj[k]==final.j)
gasit=true;
}
else if(inside(i+di[k],j+dj[k]) && a[i+di[k]][j+dj[k]]>1 && a[i+di[k]][j+dj[k]]==dmin-1 && mat[i+di[k]][j+dj[k]]==false)
vecin.push(poz(i+di[k],j+dj[k]));
}
q.pop();
}
if(!gasit)
{
while(!vecin.empty())
{
q.push(poz(vecin.front().i,vecin.front().j));
vecin.pop();
}
dmin--;
}
}
fout<<dmin-1<<'\n';
fin.close();
fout.close();
return 0;
}