Pagini recente » Cod sursa (job #583808) | Cod sursa (job #3259739) | Cod sursa (job #885033) | Cod sursa (job #2142720) | Cod sursa (job #2296735)
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
char mat[1005][1005], viz[1005][1005];
int dist[1005][1005];
struct poz
{
int x,y;
};
queue <poz> q[2], dragonasi, qc;
int solve(poz start, poz finish)
{
poz a, curent;
qc.push(start);
viz[start.x][start.y] = 1;
while(!qc.empty())
{
curent = qc.front();
a.x = curent.x + 1;
a.y = curent.y;
if(a.x < 1000)
if(viz[a.x][a.y] == 0 && dist[a.x][a.y] != 0)
{
qc.push(a);
viz[a.x][a.y] = 1;
}
a.x = curent.x - 1;
a.y = curent.y;
if(a.x > 1)
if(viz[a.x][a.y] == 0 && dist[a.x][a.y] != 0)
{
qc.push(a);
viz[a.x][a.y] = 1;
}
a.x = curent.x;
a.y = curent.y + 1;
if(a.y < 1000)
if(viz[a.x][a.y] == 0 && dist[a.x][a.y] != 0)
{
qc.push(a);
viz[a.x][a.y] = 1;
}
a.x = curent.x;
a.y = curent.y - 1;
if(a.y > 1)
if(viz[a.x][a.y] == 0 && dist[a.x][a.y] != 0)
{
qc.push(a);
viz[a.x][a.y] = 1;
}
qc.pop();
}
if(viz[finish.x][finish.y] == 0)
return -1;
return 1;
}
int main()
{
freopen("barbar.in", "r", stdin);
freopen("barbar.out", "w", stdout);
int r, col, i, j;
poz start, finish;
poz a,b, curent;
start.x=start.y=finish.x=finish.y=-1;
scanf("%d%d\n", &r, &col);
for(i = 1; i <= r; ++ i)
scanf("%s", &mat[i]);
for(i = 1; i <= r; ++ i)
for(j = 1; j <= col; ++ j)
{
if(mat[i][j] == 'D')
{
a.x = i;
a.y = j;
dragonasi.push(a);
viz[i][j] = 1;
//mat[i][j] = '*';
}
if(mat[i][j] == 'I')
{
start.y = j;
start.x = i;
}
if(mat[i][j] == 'O')
{
finish.x = i;
finish.y = j;
}
}
if(start.x==-1||finish.x==-1)
{
printf("-1");
return 0;
}
for(i = 0; i <= r + 1; ++ i)
mat[i][0] = mat[i][col + 1] = '*';
for(i = 0; i <= col + 1; ++ i)
mat[0][i] = mat[r + 1][i] = '*';
while(!(dragonasi.empty()))
{
curent = dragonasi.front();
a.x = curent.x + 1;
a.y = curent.y;
if(viz[a.x][a.y] == 0 && mat[a.x][a.y] != '*')
{
dist[a.x][a.y] = dist[curent.x][curent.y] + 1;
dragonasi.push(a);
viz[a.x][a.y] = 1;
}
a.x = curent.x - 1;
a.y = curent.y;
if(viz[a.x][a.y] == 0 && mat[a.x][a.y] != '*')
{
dist[a.x][a.y] = dist[curent.x][curent.y] + 1;
dragonasi.push(a);
viz[a.x][a.y] = 1;
}
a.x = curent.x;
a.y = curent.y + 1;
if(viz[a.x][a.y] == 0 && mat[a.x][a.y] != '*')
{
dist[a.x][a.y] = dist[curent.x][curent.y] + 1;
dragonasi.push(a);
viz[a.x][a.y] = 1;
}
a.x = curent.x;
a.y = curent.y - 1;
if(viz[a.x][a.y] == 0 && mat[a.x][a.y] != '*')
{
dist[a.x][a.y] = dist[curent.x][curent.y] + 1;
dragonasi.push(a);
viz[a.x][a.y] = 1;
}
dragonasi.pop();
}
for(i = 1; i <= 1000; ++ i)
for(j = 1; j <= 1000; ++ j)
viz[i][j] = 0;
//if(solve(start, finish) == -1)
//{
// printf("-1");
// return 0;
//}
for(i = 1; i <= 1000; ++ i)
for(j = 1; j <= 1000; ++ j)
viz[i][j] = 0;
i = dist[start.x][start.y];
q[i&1].push(start);
while(viz[finish.x][finish.y] == 0 && i >= 1)
{
while(!q[i&1].empty())
{
curent = q[i&1].front();
viz[curent.x][curent.y] = 1;
q[i&1].pop();
qc.push(curent);
}
while(!qc.empty())
{
curent = qc.front();
a.x = curent.x + 1;
a.y = curent.y;
if(viz[a.x][a.y] == 0 && dist[a.x][a.y] != 0)
{
if(dist[a.x][a.y] >= i)
qc.push(a);
else
q[1 - (i&1)].push(a);
viz[a.x][a.y] = 1;
}
a.x = curent.x - 1;
a.y = curent.y;
if(viz[a.x][a.y] == 0 && dist[a.x][a.y] != 0)
{
if(dist[a.x][a.y] >= i)
qc.push(a);
else
q[1 - (i&1)].push(a);
viz[a.x][a.y] = 1;
}
a.x = curent.x;
a.y = curent.y + 1;
if(viz[a.x][a.y] == 0 && dist[a.x][a.y] != 0)
{
if(dist[a.x][a.y] >= i)
qc.push(a);
else
q[1 - (i&1)].push(a);
viz[a.x][a.y] = 1;
}
a.x = curent.x;
a.y = curent.y - 1;
if(viz[a.x][a.y] == 0 && dist[a.x][a.y] != 0)
{
if(dist[a.x][a.y] >= i)
qc.push(a);
else
q[1 - (i&1)].push(a);
viz[a.x][a.y] = 1;
}
qc.pop();
}
-- i;
}
if(i==0)
{
printf("-1");
return 0;
}
++ i;
if(viz[finish.x][finish[y] == 0)
--i;
if(i > dist[finish.x][finish.y])
i = dist[finish.x][finish.y];
printf("%d", i);
return 0;
}