Pagini recente » Cod sursa (job #1353791) | Cod sursa (job #102674) | Poliție | Cod sursa (job #662392) | Cod sursa (job #1053043)
#include<iostream>
#include<fstream>
#include <queue>
int N,M;
int xi, yi, xf, yf;
int sc;
int ic;
int x,y;
int ok, matrice_max = -1;
int matrice[1005][1005], matrice2[1005][1005];
int X[1000005], Y[1000005];
#define nmax 1005
int dx[] = { 0, 1, 0, -1};
int dy[] = { 1, 0, -1, 0};
void citire()
{
char c;
std::cin>>N>>M;
for (int i = 1; i <= N; i++)
for (int j = 1; j <= M; j++)
{
std::cin>>c;
matrice[i][j] = nmax;
if( c == '*' )
matrice[i][j] = 0;
else
if( c == 'D' )
{
matrice[i][j] = 0;
++sc;
X[sc] = i;
Y[sc] = j;
}
else
if( c == 'I' )
{
xi = i;
yi = j;
}
else
if( c == 'O' )
{
xf = i;
yf = j;
}
}
}
void umplere()
{
for ( ic = 1; ic <= sc; ic++ )
for (int i = 0, x = X[ic], y = Y[ic]; i < 4; i++ )
if (matrice[x + dx[i]][y + dy[i]] > matrice[x][y]+1 && x+dx[i] >= 1 && x+dx[i] <= N && y+dy[i] >= 1 && y+dy[i] <= M)
{
matrice[x + dx[i]][y + dy[i]] = matrice[x][y] + 1;
sc++;
X[sc] = x + dx[i];
Y[sc] = y + dy[i];
}
}
int drum( int m )
{
if (matrice[xi][yi] < m || matrice[xf][yf] < m)
return 0;
for ( ic = sc = 0, X[ic] = xi, Y[ic] = yi; ic <= sc && matrice2[xf][yf] != m; ic++)
{
x = X[ic];
y = Y[ic];
for (int i = 0; i < 4; ++i)
if (x+dx[i] >= 1 && x+dx[i] <= N && y+dy[i] >= 1 && y+dy[i] <= M && matrice2[x + dx[i]][y + dy[i]] != m && matrice[x+dx[i]][y+dy[i]] >= m)
{
sc++;
X[sc] = x+dx[i];
Y[sc] = y+dy[i];
matrice2[x+dx[i]][y+dy[i]] = m;
}
}
if (matrice2[xf][yf] == m)
return 1;
return 0;
}
void rezolvare(int m)
{
{
if( ! drum(m) )
rezolvare(m-1);
else if (matrice_max != m)
{
matrice_max = m;
rezolvare(m+1);
}
}
}
int main()
{
citire();
umplere();
int max = M;
if( N>M )
max=N;
rezolvare(matrice[xi][yi]);
std::cout<<matrice_max;
system("pause");
return 0;
}