Pagini recente » Cod sursa (job #489405) | Cod sursa (job #1363750) | Cod sursa (job #2470923) | Cod sursa (job #1976466) | Cod sursa (job #1004514)
#include <iostream>
#include <fstream>
#include <cstring>
#include <string>
#include <climits>
#include <algorithm>
#include <cmath>
#include <queue>
#include <deque>
#include <iomanip>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
#define baza 10
#define MAX 2000
typedef long long int lli;
deque <pair <lli, lli> > coada;
int a[MAX+100][MAX+100], b[MAX+100][MAX+100];
char c;
void insert(lli i, lli j)
{
coada.push_back(make_pair(i, j));
}
int main()
{
lli n, m, i, j;
fin>>n>>m;
swap(n,m);
pair <lli, lli> init;
pair <lli, lli> last;
fin.get(c);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
fin.get(c);
if(c=='I')
{
init.first=i;
init.second=j;
}
else if(c=='O')
{
last.first=i;
last.second=j;
}
else if(c=='D')
{
a[i][j]=1;
insert(i, j);
}
else if(c=='*')
{
a[i][j]=-1;
}
}
fin.get(c);
}
for(i=0;i<=m+1;i++)
{
a[0][i]=a[n+1][i]=-1;
}
for(i=0;i<=n+1;i++)
{
a[i][0]=a[i][m+1]=-1;
}
while(!coada.empty())
{
i=coada.front().first;
j=coada.front().second;
coada.pop_front();
if(a[i-1][j]==0)
{
a[i-1][j]=a[i][j]+1;
insert(i-1, j);
}
if(a[i][j-1]==0)
{
a[i][j-1]=a[i][j]+1;
insert(i, j-1);
}
if(a[i+1][j]==0)
{
a[i+1][j]=a[i][j]+1;
insert(i+1, j);
}
if(a[i][j+1]==0)
{
a[i][j+1]=a[i][j]+1;
insert(i, j+1);
}
}
for(i=0;i<=m+1;i++)
{
b[0][i]=b[n+1][i]=-1;
}
for(i=0;i<=n+1;i++)
{
b[i][0]=b[i][m+1]=-1;
}
i=init.first;
j=init.second;
b[i][j]=a[i][j];
insert(i, j);
while(!coada.empty())
{
i=coada.front().first;
j=coada.front().second;
coada.pop_front();
if(a[i+1][j]>0 && b[i+1][j]==0)
{
if(a[i+1][j]>=b[i][j])
{
b[i+1][j]=b[i][j];
coada.push_front(make_pair(i+1, j));
}
else
{
b[i+1][j]=a[i+1][j];
insert(i+1, j);
}
}
if(a[i-1][j]>0 && b[i-1][j]==0)
{
if(a[i-1][j]>=b[i][j])
{
b[i-1][j]=b[i][j];
coada.push_front(make_pair(i-1, j));
}
else
{
b[i-1][j]=a[i-1][j];
insert(i-1, j);
}
}
if(a[i][j-1]>0 && b[i][j-1]==0)
{
if(a[i][j-1]>=b[i][j])
{
b[i][j-1]=b[i][j];
coada.push_front(make_pair(i, j-1));
}
else
{
b[i][j-1]=a[i][j-1];
insert(i, j-1);
}
}
if(a[i][j+1]>0 && b[i][j+1]==0)
{
if(a[i][j+1]>=b[i][j])
{
b[i][j+1]=b[i][j];
coada.push_front(make_pair(i, j+1));
}
else
{
b[i][j+1]=a[i][j+1];
insert(i, j+1);
}
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
b[i][j]--;
}
}
fout<<b[last.first][last.second];
return 0;
}