Pagini recente » Cod sursa (job #1003394) | Cod sursa (job #75489) | Cod sursa (job #1931619) | Cod sursa (job #743104) | Cod sursa (job #2219942)
#include <fstream>
#include <queue>
#include <limits.h>
using namespace std;
ifstream fin ("barbar.in");
ofstream fout ("barbar.out");
const int INF = INT_MAX;
int mat[1005][1005], d[1005][1005];
int r, c, i, j, startx, starty, stopx, stopy, dir;
int di[4] = {0, 0, 1, -1};
int dj[4] = {1, -1, 0 ,0};
char v[1005][1005];
queue < pair <int, int> > Q;
bool isOk(int i, int j)
{
return (i >= 1 && i <= r && j >= 1 && j <= c && v[i][j] != '*');
}
void Lee1()
{
int i, j, i2, j2;
while (!Q.empty()){
i = Q.front().first;
j = Q.front().second;
for (dir=0; dir<4; dir++){
i2 = i + di[dir];
j2 = j + dj[dir];
if (isOk(i2, j2) && d[i2][j2] > d[i][j] + 1){
d[i2][j2] = d[i][j] + 1;
Q.push(make_pair(i2, j2));
}
}
Q.pop();
}
}
void Lee2()
{
int i, j, i2, j2;
while (!Q.empty()){
i = Q.front().first;
j = Q.front().second;
for (dir=0; dir<4; dir++){
i2 = i + di[dir];
j2 = j + dj[dir];
if (isOk(i2, j2)){
if (mat[i2][j2] == -1){
mat[i2][j2] = min(mat[i][j], d[i2][j2]);
Q.push(make_pair(i2, j2));
}
else if (mat[i2][j2] < min(mat[i][j], d[i2][j2])){
mat[i2][j2] = min(mat[i][j], d[i2][j2]);
Q.push(make_pair(i2, j2));
}
}
}
Q.pop();
}
}
int main()
{
fin >> r >> c;
for (i=1; i<=r; i++){
for (j=1; j<=c; j++){
fin >> v[i][j];
if (v[i][j] == 'D'){
Q.push(make_pair(i, j));
d[i][j] = 0;
}
else {
if (v[i][j] == 'I'){
startx = i;
starty = j;
}
if (v[i][j] == 'O'){
stopx == i;
stopy == j;
}
d[i][j] = INF;
}
}
}
//Lee1();
while (!Q.empty()){
i = Q.front().first;
j = Q.front().second;
for (dir=0; dir<4; dir++){
int i2 = i + di[dir];
int j2 = j + dj[dir];
if (isOk(i2, j2) && d[i2][j2] > d[i][j] + 1){
d[i2][j2] = d[i][j] + 1;
Q.push(make_pair(i2, j2));
}
}
Q.pop();
}
for (i=1; i<=r; i++)
for (j=1; j<=c; j++)
mat[i][j] = -1;
Q.push(make_pair(startx, starty));
mat[startx][starty] = d[startx][starty];
//ee2();
while (!Q.empty()){
i = Q.front().first;
j = Q.front().second;
for (dir=0; dir<4; dir++){
int i2 = i + di[dir];
int j2 = j + dj[dir];
if (isOk(i2, j2)){
if (mat[i2][j2] == -1){
mat[i2][j2] = min(mat[i][j], d[i2][j2]);
Q.push(make_pair(i2, j2));
}
else if (mat[i2][j2] < min(mat[i][j], d[i2][j2])){
mat[i2][j2] = min(mat[i][j], d[i2][j2]);
Q.push(make_pair(i2, j2));
}
}
}
Q.pop();
}
fout << mat[stopx][stopy];
return 0;
}