Pagini recente » Istoria paginii runda/winners32/clasament | Cod sursa (job #2813037) | Autentificare | Istoria paginii runda/231/clasament | Cod sursa (job #2813047)
#include <iostream>
#include <fstream>
#include <queue>
#include <climits>
#include <set>
#include <iomanip>
#define inf INT_MAX-100000
using namespace std;
ifstream f ("barbar.in");
ofstream g ("barbar.out");
int main()
{
char s;
int vmax;
int n,m,i,j;
int startx,stopx;
int starty,stopy;
queue<pair<int,int>> coada;
int vx[]= {0, 1, 0, -1};
int vy[]= {1, 0, -1, 0};
f>>n>>m;
int mat[n][m];
int path[n][m];
int cpy[n][m];
int inSet[n][m];
int tx[n][m],ty[n][m];
for (i=0; i<n; ++i)
for (j=0; j<m; ++j)
{
f>>s;
if (s=='.')
mat[i][j]=-1;
else if (s=='*')
mat[i][j]=-300;
else if (s=='D')
{
mat[i][j]=0;
coada.push(make_pair(i,j));
}
else
{
mat[i][j]=-1;
if (s=='I')
{
startx=i;
starty=j;
}
else
{
stopx=i;
stopy=j;
}
}
path[i][j]=inf;
tx[i][j]=ty[i][j]=0;
cpy[i][j]=s;
inSet[i][j]=false;
}
while (!coada.empty())
{
pair<int,int> nod_curent=coada.front();
int x=nod_curent.first;
int y=nod_curent.second;
coada.pop();
for (i=0; i<4; ++i)
if (x+vx[i]<m && x+vx[i]>=0 && y+vy[i]<n && y+vy[i]>=0)
if (mat[x+vx[i]][y+vy[i]]==-1)
{
mat[x+vx[i]][y+vy[i]]=mat[x][y]+1;
if (mat[x][y]+1>vmax)
vmax=mat[x][y]+1;
coada.push(make_pair(x+vx[i],y+vy[i]));
}
}
/*for (i=0; i<n; ++i)
{
for (j=0; j<m; ++j)
g<<std::right<<std::setw(7)<<mat[i][j]<<" ";
g<<"\n";
}
g<<"\n\n\n";*/
set <pair<int,pair<int,int>>> set_noduri;
path[startx][starty]=0;
set_noduri.insert(make_pair(0,make_pair(startx,starty)));
while (!set_noduri.empty() && !inSet[stopx][stopy])
{
pair <int,pair<int,int>> date_nod=*(set_noduri.begin());
set_noduri.erase(set_noduri.begin());
int x=date_nod.second.first;
int y=date_nod.second.second;
for (i=0; i<4; ++i)
if (x+vx[i]<m && x+vx[i]>=0 && y+vy[i]<n && y+vy[i]>=0 && cpy[x+vx[i]][y+vy[i]]!='*' && cpy[x+vx[i]][y+vy[i]]!='D')
{
if (vmax-mat[x+vx[i]][y+vy[i]]<path[x+vx[i]][y+vy[i]] && !inSet[x+vx[i]][y+vy[i]])
{
path[x+vx[i]][y+vy[i]]=vmax-mat[x+vx[i]][y+vy[i]];
inSet[x+vx[i]][y+vy[i]]=true;
set_noduri.insert(make_pair(path[x+vx[i]][y+vy[i]],make_pair(x+vx[i],y+vy[i])));
tx[x+vx[i]][y+vy[i]]=x;
ty[x+vx[i]][y+vy[i]]=y;
}
}
}
int x=stopx;
int y=stopy;
int vmin=inf;
if (path[stopx][stopy]==inf)
g<<-1;
else
{
while (x!=startx || y!=starty)
{
// g<<x<<" "<<y<<"\n";
if (mat[x][y]<vmin)
vmin=mat[x][y];
//path[x][y]=-1;
int auxx=x,auxy=y;
x=tx[auxx][auxy];
y=ty[auxx][auxy];
}
if (mat[x][y]<vmin)
vmin=mat[x][y];
//path[x][y]=-1;
/*for (i=0; i<n; ++i)
{
for (j=0; j<m; ++j)
if (path[i][j]==inf)
g<<std::right<<std::setw(7)<<0<<" ";
else
g<<std::right<<std::setw(7)<<path[i][j]<<" ";
g<<"\n";
}*/
g<<vmin;
}
}