Pagini recente » Cod sursa (job #1809872) | Cod sursa (job #1664032) | Cod sursa (job #757036) | Cod sursa (job #64244) | Cod sursa (job #5366)
Cod sursa(job #5366)
// Barbar.cpp : Defines the entry point for the console application.
//
#include <stdio.h>
//#include <conio.h>
#pragma warning(disable : 4996)
#define INFINITE 999999999
#define SIZE 1010
#define VECTORSIZE SIZE*SIZE*4
int r, c, sx, sy, ex, ey;
char map[SIZE][SIZE];
long leeDD[SIZE][SIZE];
bool passed[SIZE][SIZE];
struct
{
long x, y, dd;
} lv[VECTORSIZE];
long ap = 0, le = 0;
int main(int argc, char* argv[])
{
int i, j;
FILE *f = fopen("barbar.in", "r");
fscanf(f, "%d %d\n", &r, &c);
for(i=0;i<=c+1;i++)
{
map[0][i] = '*';
map[r+1][i] = '*';
};
for(i=1;i<=r;i++)
{
map[i][0] = '*';
fgets(&map[i][1], SIZE-2, f);
map[i][c+1] = '*';
for(j=1;j<=c;j++)
{
leeDD[i][j] = INFINITE;
switch(map[i][j])
{
case 'I': sx = j; sy = i; map[i][j] = '.'; leeDD[i][j] = INFINITE+1; break;
case 'O': ex = j; ey = i; map[i][j] = '.'; leeDD[i][j] = INFINITE+1; break;
case 'D': lv[le].x = j; lv[le].y = i; lv[le].dd = 0; le++; leeDD[i][j] = 0; map[i][j] = '*'; break;
}
}
}
fclose(f);
long dx, dy;
for(ap = 0; ap < le; ap++)
{
dx = lv[ap].x;
dy = lv[ap].y;
leeDD[dy][dx] = lv[ap].dd;
dx = lv[ap].x - 1;
dy = lv[ap].y;
if (map[dy][dx] != '*')
{
if (leeDD[dy][dx] > lv[ap].dd+1)
{
lv[le].x = dx;
lv[le].y = dy;
lv[le].dd = lv[ap].dd + 1;
le++;
}
};
/*******************************************/
dx = lv[ap].x + 1;
dy = lv[ap].y;
if (map[dy][dx] != '*')
{
if (leeDD[dy][dx] > lv[ap].dd+1)
{
lv[le].x = dx;
lv[le].y = dy;
lv[le].dd = lv[ap].dd + 1;
le++;
}
};
/*******************************************/
dx = lv[ap].x;
dy = lv[ap].y - 1;
if (map[dy][dx] != '*')
{
if (leeDD[dy][dx] > lv[ap].dd+1)
{
lv[le].x = dx;
lv[le].y = dy;
lv[le].dd = lv[ap].dd + 1;
le++;
}
};
/*******************************************/
dx = lv[ap].x;
dy = lv[ap].y + 1;
if (map[dy][dx] != '*')
{
if (leeDD[dy][dx] > lv[ap].dd+1)
{
lv[le].x = dx;
lv[le].y = dy;
lv[le].dd = lv[ap].dd + 1;
le++;
}
};
/*******************************************/
}
long stx, sty, enx, eny;
if (leeDD[ey][ex] < leeDD[sy][sx])
{
stx = ex;
sty = ey;
enx = sx;
eny = sy;
} else {
stx = sx;
sty = sy;
enx = ex;
eny = ey;
};
passed[sty][stx] = false;
while(leeDD[sty][stx] > 0 && !passed[sty][stx])
{
le = 0;
lv[le].x = stx;
lv[le].y = sty;
lv[le].dd = leeDD[sty][stx];
le++;
for(i=0;i<=r+1;i++)
for(j=0;j<=c+1;j++)
passed[i][j] = false;
for(ap = 0; ap < le && !passed[eny][enx]; ap++)
{
long dd;
dx = lv[ap].x - 1;
dy = lv[ap].y;
dd = lv[ap].dd;
if (map[dy][dx] != '*' && leeDD[dy][dx] >= dd && !passed[dy][dx])
{
lv[le].x = dx;
lv[le].y = dy;
leeDD[dy][dx] = dd;
passed[dy][dx] = true;
le++;
};
/**************************************/
dx = lv[ap].x + 1;
dy = lv[ap].y;
dd = lv[ap].dd;
if (map[dy][dx] != '*' && leeDD[dy][dx] >= dd && !passed[dy][dx])
{
lv[le].x = dx;
lv[le].y = dy;
leeDD[dy][dx] = dd;
passed[dy][dx] = true;
le++;
};
/**************************************/
dx = lv[ap].x;
dy = lv[ap].y - 1;
dd = lv[ap].dd;
if (map[dy][dx] != '*' && leeDD[dy][dx] >= dd && !passed[dy][dx])
{
lv[le].x = dx;
lv[le].y = dy;
leeDD[dy][dx] = dd;
passed[dy][dx] = true;
le++;
};
/**************************************/
dx = lv[ap].x;
dy = lv[ap].y + 1;
dd = lv[ap].dd;
if (map[dy][dx] != '*' && leeDD[dy][dx] >= dd && !passed[dy][dx])
{
lv[le].x = dx;
lv[le].y = dy;
leeDD[dy][dx] = dd;
passed[dy][dx] = true;
le++;
};
/**************************************/
};
leeDD[sty][stx]--;
};
leeDD[sty][stx]++;
long ntw;
if (passed[eny][enx])
{
ntw = leeDD[eny][enx];
} else {
ntw = -1;
}
f = fopen("barbar.out","w");
fprintf(f, "%ld", ntw);
fclose(f);
return 0;
}