Pagini recente » Cod sursa (job #1397356) | Cod sursa (job #2591755) | Cod sursa (job #100902) | Cod sursa (job #2915871) | Cod sursa (job #484265)
Cod sursa(job #484265)
#include<fstream>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define MAXN 1005
char mat[MAXN][MAXN];
int b[MAXN][MAXN];
int sol[MAXN][MAXN];
int n,m;
inline int min(const int a, const int b)
{
return a<b?a:b;
}
int GetNeighbors(int x, int y, pair<int,int> v[4])
{
int num=0;
if(x-1>=1)
{
v[num++]=make_pair(x-1,y);
}
if(x+1<=n)
{
v[num++]=make_pair(x+1,y);
}
if(y-1>=1)
{
v[num++]=make_pair(x,y-1);
}
if(y+1<=m)
{
v[num++]=make_pair(x,y+1);
}
return num;
}
void sort(pair<int,int> v[4], int num)
{
bool ord;
pair<int,int> aux;
do
{
ord=false;
for(int i=0; i<num-1; ++i)
if( b[v[i].first][v[i].second] <
b[v[i+1].first][v[i+1].second])
{
aux=v[i];
v[i]=v[i+1];
v[i+1]=aux;
ord=true;
}
}while(ord);
}
int main()
{
fstream fin("barbar.in", fstream::in);
fstream fout("barbar.out", fstream::out);
queue<pair<int,int> > Q;
pair<int,int> start,end;
fin>>n>>m;
//cout<<n<<" "<<m<<endl;
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
{
fin>>mat[i][j];
sol[i][j]=-1;
switch(mat[i][j])
{
case 'D':
{
Q.push(make_pair(i,j));
b[i][j]=0;
}; break;
case '*':
{
b[i][j]=-2;
}; break;
case 'I':
{
start=make_pair(i,j);
b[i][j]=-1;
}; break;
case 'O':
{
end=make_pair(i,j);
b[i][j]=-1;
}; break;
default:
b[i][j]=-1;
}
//cout<<mat[i][j];
}
//cout<<endl;
}
while(!Q.empty())
{
pair<int,int> node=Q.front(), v[4];
int num=GetNeighbors(node.first,node.second,v);
Q.pop();
for(int i=0; i<num; ++i)
{
if( b[v[i].first][v[i].second]==-1 ||
b[node.first][node.second]+1<b[v[i].first][v[i].second])
{
Q.push(v[i]);
b[v[i].first][v[i].second]=b[node.first][node.second]+1;
}
}
}
/*cout<<endl;
for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
{
cout<<b[i][j]<<" ";
}
cout<<endl;
}*/
if(b[end.first][end.second]==-1)
{
//cout<<"No solution\n";
fout<<-1;
}
//cout<<endl;
Q.push(start);
sol[start.first][start.second]=b[start.first][start.second];
while(!Q.empty())
{
pair<int,int> node=Q.front(), v[4];
int num=GetNeighbors(node.first,node.second,v);
Q.pop();
sort(v,num);
//if(node.first==end.first && node.second==end.second)
// break;
for(int i=0; i<num; ++i)
{
if(sol[v[i].first][v[i].second]==-1)
{
sol[v[i].first][v[i].second]=
min(sol[node.first][node.second],b[v[i].first][v[i].second]);
Q.push(v[i]);
}
else
{
int minimum=min(sol[node.first][node.second],b[v[i].first][v[i].second]);
if(minimum>sol[v[i].first][v[i].second])
{
sol[v[i].first][v[i].second]=minimum;
Q.push(v[i]);
}
}
}
}
//cout<<start.first<<" "<<start.second<<endl;
//cout<<end.first<<" "<<end.second<<endl;
fout<<sol[end.first][end.second]<<endl;
/*for(int i=1; i<=n; ++i)
{
for(int j=1; j<=m; ++j)
{
cout<<sol[i][j]<<" ";
}
cout<<endl;
}*/
fin.close();
fout.close();
return 0;
}