Pagini recente » Monitorul de evaluare | Profil _renny | Cod sursa (job #1373175) | Traian Mihai Danciu | Cod sursa (job #1771390)
#include <cstdio>
#include <deque>
#include <algorithm>
using namespace std;
const int N = 1005;
const int PERETIE = 0;
const int SPATIU = -1;
struct ABC
{
int i, j, nr;
};
int d[N][N];
int linie[] = {1 , 0 , -1 , 0};
int coloana[] = {0 , 1 , 0 , -1};
deque <ABC> q;
int main()
{
ABC x;
int n, m, i, j, iI, jI, iO, jO, nr, k, val = 0;
char ch;
freopen("barbar.in","r",stdin);
freopen("barbar.out","w",stdout);
scanf("%d%d\n", &n, &m);
scanf("%c", &ch);
for(i = 1;i <= n; ++i){
for(j = 1;j <= m; ++j){
if(ch == '.'){
d[i][j] = SPATIU;
}
else if(ch == 'I'){
iI = i;
jI = j;
d[i][j] = SPATIU;
}
else if(ch == 'O'){
iO = i;
jO = j;
d[i][j] = SPATIU;
}
else if(ch == '*'){
d[i][j] = PERETIE;
}
else if(ch == 'D'){
x.i = i;
x.j = j;
x.nr = 0;
q.push_back(x);
d[i][j] = PERETIE;
}
scanf("%c", &ch);
}
scanf("%c", &ch);
}
while(!q.empty()){
i = q.front().i;
j = q.front().j;
nr = q.front().nr;
d[i][j] = nr;
q.pop_front();
for(k = 0;k < 4; ++k){
x.i = i + linie[k];
x.j = j + coloana[k];
x.nr = nr + 1;
if(d[x.i][x.j] == SPATIU){
d[x.i][x.j] = PERETIE;
q.push_back(x);
}
}
}
/*for(i = 1;i <= n; ++i){
for(j = 1;j <= m; ++j){
printf("%d ",d[i][j]);
}
printf("\n");
}*/
x.i = iI;
x.j = jI;
x.nr = d[iI][jI];
d[iI][jI] = 0;
q.push_back(x);
do{
val = q.size();
i = q.front().i;
j = q.front().j;
nr = q.front().nr;
q.pop_front();
for(k = 0;k < 4; ++k){
x.i = i + linie[k];
x.j = j + coloana[k];
if(d[x.i][x.j] > 0){
if(d[x.i][x.j] >= nr){
x.nr = nr;
q.push_front(x);
}
else{
x.nr = d[x.i][x.j];
q.push_back(x);
}
d[x.i][x.j] = -1;
}
}
}while((i != iO || j != jO) && q.size() > 0);
if(i == iO && j == jO){
printf("%d\n",nr);
}
else{
printf("-1\n");
}
return 0;
}