Pagini recente » Istoria paginii utilizator/ionutz_cristian | Istoria paginii utilizator/arsene_denisa | Istoria paginii utilizator/solo22 | Algoritmiada 2015 - Clasament Runda 2, Juniori | Cod sursa (job #419796)
Cod sursa(job #419796)
#include<fstream>
using namespace std;
int n,m;
int a[1003][1003],starti,startj,b[1003][1003],c[1003][1003],finishi,finishj;
struct asa{
int pti;
int ptj;};
int di[4]={0,0,-1,1},dj[4]={-1,1,0,0},dr,st;
asa coada[100000];
void bfs();
void bfs1();
int main()
{
ifstream fin ("barbar.in");
ofstream fout("barbar.out");
fin>>n>>m;
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
char c;
fin>>c;
if(c=='.')
a[i][j]=0;
if(c=='*')
a[i][j]=-1,b[i][j]=-1;
if(c=='D')
a[i][j]=1,coada[++dr].pti=i,coada[dr].ptj=j,b[i][j]=0;
if(c=='I')
starti=i,startj=j;
if(c=='O')
finishi=i,finishj=j;
}
//fout<<dr<<endl;
bfs();
bfs1();
// for(i=1;i<=n;i++)
//{
// for(j=1;j<=n;j++)
// fout<<c[i][j]<<" ";
//fout<<endl;
// }
fout<<c[finishi][finishj];
return 0;
}
void bfs()
{
st=1;
int k;
while(st<=dr)
{
for(k=0;k<=3;k++)
{
int ii,jj;
ii=coada[st].pti+di[k];
jj=coada[st].ptj+dj[k];
if(ii>=1 && ii<=n && jj>=1 && jj<=m && a[ii][jj]==0)
{
if(b[ii][jj]==0 || b[ii][jj]>b[coada[st].pti][coada[st].ptj]+1)
b[ii][jj]=b[coada[st].pti][coada[st].ptj]+1;
coada[++dr].pti=ii;
coada[dr].ptj=jj;
a[ii][jj]=1;
}
}
st++;
}
}
void bfs1()
{
st=1;dr=1;
coada[1].pti=starti;
coada[1].ptj=startj;
c[starti][startj]=b[starti][startj];
while(st<=dr)
{
int k;
for(k=0;k<=3;k++)
{
int ii,jj;
ii=coada[st].pti+di[k];
jj=coada[st].ptj+dj[k];
if(ii>=1 && ii<=n && jj>=1 && jj<=m)
{
if(c[ii][jj]==0 && b[ii][jj]>0)
{
coada[++dr].pti=ii;
coada[dr].ptj=jj;
if(c[coada[st].pti][coada[st].ptj]>b[ii][jj])
c[ii][jj]=b[ii][jj];
else
c[ii][jj]=c[coada[st].pti][coada[st].ptj];
}
//if(c[ii][jj]!=0 && b[ii][jj]>0)
// if(c[ii][jj]<c[coada[st].pti][coada[st].ptj])
// c[ii][jj]=c[coada[st].pti][coada[st].ptj];
}
}
st++;
}
}