Pagini recente » Cod sursa (job #2931684) | Cod sursa (job #553548) | Cod sursa (job #764253) | Cod sursa (job #1858678) | Cod sursa (job #2241879)
#include <fstream>
#include <queue>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
pair<int,int>x;
pair<pair<int,int>,int>x2;
queue<pair<pair<int,int>,int> >dq;
int n,m,i,j,a,b,cost,ls,cs,l[1000001],c[1000001],v2[1001][1001],v3[1001][1001],v[1001][1001],nr;
int main(int argc, char *argv[]) {
f>>n>>m;
for(i=1;i<=n;i++) {
for(j=1;j<=m;j++) {
f>>a;
v2[i][j]=n*m+1;
v3[i][j]=-1;
if(a=='D') {
nr++;
l[nr]=i;
c[nr]=j;
}
else if(a=='I') {
ls=i;
cs=j;
v[i][j]=-2;
}
else if(a=='*') {
v[i][j]=-1;
}
}
}
for(i=1;i<=nr;i++) {
x=make_pair(l[i],c[i]);
x2=make_pair(x,0);
dq.push(x2);
}
while(!dq.empty()) {
a=dq.front().first.first;
b=dq.front().first.second;
cost=dq.front().second;
if(cost<v2[a][b]) {
v2[a][b]=cost;
if(a>1) {
x=make_pair(a-1,b);
x2=make_pair(x,cost+1);
dq.push(x2);
}
if(b>1) {
x=make_pair(a,b-1);
x2=make_pair(x,cost+1);
dq.push(x2);
}
if(a<n) {
x=make_pair(a+1,b);
x2=make_pair(x,cost+1);
dq.push(x2);
}
if(b<m) {
x=make_pair(a,b+1);
x2=make_pair(x,cost+1);
dq.push(x2);
}
}
dq.pop();
}
x=make_pair(ls,cs);
x2=make_pair(x,v2[ls][cs]);
dq.push(x2);
while(!dq.empty()) {
a=dq.front().first.first;
b=dq.front().first.second;
cost=dq.front().second;
cost=min(cost,v2[a][b]);
if(cost>v3[a][b]) {
v3[a][b]=cost;
if(a>1 && v[a-1][b]==0) {
x=make_pair(a-1,b);
x2=make_pair(x,cost);
dq.push(x2);
}
if(b>1 && v[a-1][b]==0) {
x=make_pair(a,b-1);
x2=make_pair(x,cost);
dq.push(x2);
}
if(a<n && v[a-1][b]==0) {
x=make_pair(a+1,b);
x2=make_pair(x,cost);
dq.push(x2);
}
if(b<m && v[a-1][b]==0) {
x=make_pair(a,b+1);
x2=make_pair(x,cost);
dq.push(x2);
}
}
dq.pop();
}
g<<v3[a][b];
}