Pagini recente » Cod sursa (job #578007) | Cod sursa (job #2576411) | Cod sursa (job #952820) | Cod sursa (job #3132667) | Cod sursa (job #316568)
Cod sursa(job #316568)
#include<cstdio>
#include<vector>
#include<string.h>
using namespace std;
#define IN "barbar.in","r",stdin
#define OUT "barbar.out","w",stdout
#define Nmax 1050
#define PII pair<int,int>
#define x first
#define y second
const int dx[5] = {0 , 0 , 1 , -1};
const int dy[5] = {-1 , 1 , 0 , 0};
int R , C , E = 0 , sfx , sfy ;
int maxim = - 2000000;
int ix , iy ;
int MAT[Nmax][Nmax] , M[Nmax][Nmax];
PII coada[Nmax];
void MAT_make()
{
int nx , ny ;
for(int i = 1 ; i <= E ; ++i)
for(int k = 0 ; k <= 3 ; ++k)
{
nx = coada[i].x + dx[k];
ny = coada[i].y + dy[k];
if(nx >= 1 && nx <= R && ny >= 1 && ny <= C && (MAT[nx][ny] != -4 || MAT[nx][ny] || MAT[nx][ny] != -3))
{
if(MAT[coada[i].x][coada[i].y] + 1 < MAT[nx][ny] && (MAT[nx][ny] != -2 || MAT[nx][ny] == -1))
{
MAT[nx][ny] = MAT[coada[i].x][coada[i].y] + 1;
coada[++E].x = nx;
coada[E].y = ny;
}
else if(MAT[nx][ny] == -2|| MAT[nx][ny] == -1)
{
MAT[nx][ny] = MAT[coada[i].x][coada[i].y] + 1;
coada[++E].x = nx;
coada[E].y = ny;
}
if(MAT[nx][ny] > maxim) maxim = MAT[nx][ny];
}
}
for(int i = 1 ; i <= R ; ++i)
{
for(int j = 1 ; j <= C ; ++j) printf(" %d ",MAT[i][j]);
printf("\n");
}
}
int verific(int m)
{
int nx , ny;
for(int p = 1 ; p <= R ; ++p)
for(int t = 1 ; t <= C ; ++t)
M[p][t] = 0;
//memset(M , 0 , C*R);
for(int i = 1 ; i <= E ; ++i) {
coada[i].x = 0 ;
coada[i].y = 0;
}
E = 1;
coada[1].x = ix;
coada[1].y = iy;
/*
for(int p = 1 ; p <= R ; ++p)
{
for(int t = 1 ; t <= C ; ++t)
printf(" %d ",M[p][t]);
printf("\n");
}*/
//printf("%d %d %d\n",E , coada[1].x , coada[1].y);
M[ix][iy] = 1;
for(int i = 1 ; i <= E ; ++i)
for(int k = 0 ; k <= 3 ; ++k)
{
nx = coada[i].x + dx[k];
ny = coada[i].y + dy[k];
if(nx == sfx && ny == sfy) return 1;
if(nx >= 1 && nx <= R && ny >= 1 && ny <= C && MAT[nx][ny] >= m && M[nx][ny] == 0 && MAT[nx][ny] != 0 )
{
coada[++E].x = nx;
M[nx][ny] = 1;
coada[E].y = ny;
}
}
return 0;
}
int main()
{
freopen(IN);
freopen(OUT);
scanf("%d%d\n",&R,&C);
char ch;
for(int i = 1 ; i <= R ; ++i)
{
for(int j = 1 ; j <= C ; ++j)
{
scanf("%c",&ch);
if(ch == 'D')
{
coada[++E].x = i;
coada[E].y = j;
MAT[i][j] = 0;
}
if(ch == 'I') {MAT[i][j] = -1;ix = i;iy = j;}
if(ch == '.') MAT[i][j] = -2;
if(ch == 'O') {MAT[i][j] = -3;sfx = i ; sfy = j;}
if(ch == '*') MAT[i][j] = -4;
}
scanf("\n");
}
MAT_make();
int st = 0 , dr = maxim , m , sol = -2000000;
while(st <= dr)
{
m = (st + dr) / 2;
//printf("%d \n",verific(m));
if(verific(m) == 1) {dr = m - 1 ; sol = m;}
else st = m + 1;
for(int i = 1; i <= R ; ++i)
{
for(int j = 1; j <= C ; ++j)
printf("%d ",M[i][j]);
printf("\n");
}
printf("\n");
}
if(sol == -2000000) {printf("-1");return 0;}
printf("%d\n",sol);
return 0;
}