Pagini recente » Cod sursa (job #3213060) | Cod sursa (job #1985787) | Cod sursa (job #639717) | Cod sursa (job #2332647) | Cod sursa (job #1064943)
#include <iostream>
#include <string>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <stdarg.h>
#include <stdio.h>
#include <set>
using namespace std;
//#include <unordered_map>
#define NMAX 10001
int dx[] = {0, 0, -1, 1};
int dy[] = {-1, 1, 0, 0};
deque<pair< int, int> > Q, C;
int r, c, a[NMAX][NMAX], starti, startj, finishi, finishj, isOK, d[NMAX][NMAX];
char caracter;
void BFS ()
{
while ( !Q.empty() )
{
int x = Q.front().first;
int y = Q.front().second;
Q.pop_front ();
for ( int k = 0; k < 4; k++ )
{
int xi = x + dx[k], xj = y + dy[k];
if ( xi < r && xj < c && xi >= 0 && xj >= 0 && a[xi][xj] == 0 )
{
if( a[x][y] == -2 )
a[xi][xj] = 1;
else
{
a[xi][xj] = a[x][y] + 1;
}
Q.push_back (make_pair ( xi, xj ));
}
}
}
}
void BFSforQuestion ()
{
int k,x,y;
if( starti == finishi && startj == finishj )
isOK = 1;
C.push_front (make_pair(starti, startj));
while( !C.empty() )
{
x = C.front().first;
y = C.front().second;
C.pop_front();
for( int k = 0; k < 4; k++)
{
if( ( d[x + dx[k]][y + dy[k]] == 0 ) && a[x + dx[k]][y + dy[k]] > 0 && x + dx[k] < r && y + dy[k] < c && x + dx[k] >= 0 && y + dy[k] >= 0 )
{
if( x + dx[k] == finishi && y + dy[k] == finishj )
isOK=1;
if( a[x + dx[k]][y + dy[k]] >= d[x][y] )
{
d[x + dx[k]][y + dy[k]] = d[x][y];
C.push_front( make_pair (x + dx[k], y + dy[k]) );
}
else
{
d[x + dx[k]][y + dy[k]] = a[x + dx[k]][y + dy[k]];
C.push_back( make_pair (x + dx[k], y + dy[k]) );
}
}
}
}
}
int main ()
{
FILE *f = fopen ("barbar.in", "r");
FILE *g = fopen ("barbar.out", "w");
fscanf (f, "%d %d",&r, &c);
char x;
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
fscanf (f, "%c", &x);
if (x == '\n')
fscanf (f, "%c", &caracter);
else
caracter = x;
if ( caracter == '*' )
a[i][j] = -1;
else
if ( caracter == '.' )
a[i][j] = 0;
else
if ( caracter == 'D' )
{
a[i][j] = -2;
Q.push_back (make_pair(i, j));
}
else
if ( caracter == 'I' )
{
a[i][j] = 0;
starti = i; startj = j;
}
else
if ( caracter == 'O' )
{
a[i][j] = 0;
finishi = i; finishj = j;
}
}
}
BFS();
/*starti = 1; startj = 1;
finishi = 8; finishj = 3;
for(int i = 0; i < r; i++)
for(int j = 0; j < c; j++)
d[i][j] = 0;*/
d[starti][startj] = a[starti][startj];
BFSforQuestion();
/*for (int i = 0; i < r; i++)
{
for (int j = 0; j < r; j++)
{
fprintf (g, "%d ", d[i][j]);
}
fprintf (g, "\n");
}*/
if ( isOK == 1 )
fprintf (g, "%d", d[finishi][finishj]);
else
fprintf (g, "%d", -1);
fclose(f);
fclose(g);
return 0;
}