Pagini recente » Cod sursa (job #2982740) | Rating Oproiu Constantin (Oproiu_Constantin) | Cod sursa (job #1853899) | Cod sursa (job #1317761) | Cod sursa (job #1760979)
#include <iostream>
#include <fstream>
#include <queue>
#include <climits>
using namespace std;
int a[1001][1001],startx,starty,endx,endy,n,m;
int b[1001][1001];
int di[]={1,0,-1,0};
int dj[]={0,1,0,-1};
queue <pair<int,int> > q;
ifstream f("barbar.in");
ofstream g("barbar.out");
bool check(int x,int y)
{
if(x<1 || y <1 || x>n || y >m)
return 0;
return 1;
}
void bfs2(int startx,int starty,int endx,int endy)
{
int i,j,inou,jnou;
q.push(make_pair(startx,starty));
while(!q.empty())
{
i=q.front().first;
j=q.front().second;
q.pop();
//cout << i <<" " << j << "\n";
for(int k=0;k<4;k++)
{
inou=i+di[k];
jnou=j+dj[k];
if(check(i,j) && a[inou][jnou]>=0)
{
if( b[inou][jnou]<b[i][j] && b[i][j]<=a[inou][jnou]){
b[inou][jnou]=b[i][j];
q.push(make_pair(inou,jnou));
}else if(b[inou][jnou]==-1)
{
b[inou][jnou]=a[inou][jnou];
q.push(make_pair(inou,jnou));
}
}
}
}
}
void bfs()
{
int i,j,inou,jnou;
while(!q.empty())
{
i=q.front().first;
j=q.front().second;
q.pop();
for(int k=0;k<4;k++)
{
inou=di[k]+i;
jnou=dj[k]+j;
if(check(inou,jnou) && a[i][j]+1<a[inou][jnou])
{
a[inou][jnou]=a[i][j]+1;
q.push(make_pair(inou,jnou));
}
}
}
}
int main()
{
f >> n >> m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
b[i][j]=-1;
a[i][j]=INT_MAX;
}
char c;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
f >> c;
if(c=='D')
{
a[i][j]=0;
q.push(make_pair(i,j));
}
if(c=='*')
{
a[i][j]=-1;
}
if(c=='I')
{
startx=i;
starty=j;
}
if(c=='O')
{
endx=i;
endy=j;
}
}
bfs();
bfs2(startx,starty,endx,endy);
g << b[endx][endy] << "\n";
return 0;
}