Pagini recente » Monitorul de evaluare | Monitorul de evaluare | Statistici Misca Liviu (hollachiquita92) | Cod sursa (job #1293906) | Cod sursa (job #2143314)
#include <fstream>
#include <queue>
using namespace std;
queue <int> lin;
queue <int> col;
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int a[1003][1003],d[1003][1003],n,m,x1,x2,y1,y2;
bool Lee(int k) {
int x,y,l,c,i,j;
while (!lin.empty())
lin.pop(),col.pop();
for (i=1;i<=n;++i)
for (j=1;j<=m;++j)
if (a[i][j]>0) a[i][j]=0;
lin.push(x1),col.push(y1);
while (!lin.empty()) {
x=lin.front();
y=col.front();
for (int p=0;p<4;++p) {
l=x+dx[p];
c=y+dy[p];
if (a[l][c]==0 && d[l][c]>=k) {
lin.push(l);
col.push(c);
if (l==x2 && c==y2) return 1;
}
a[l][c]=1;
}
lin.pop(),col.pop();
}
return 0;
}
int main()
{ int i,j,st,dr,mij,sol=0,x,y,l,c;char ch;
ifstream f("barbar.in");
ofstream g("barbar.out");
f>>n>>m;
for (i=1;i<=n;++i)
for (j=1;j<=m;++j) {
f>>ch;
if (ch=='*' || ch=='D') a[i][j]=-1;
if (ch=='D') lin.push(i),col.push(j);
if (ch=='I') x1=i,y1=j;
if (ch=='O') x2=i,y2=j;
}
for (i=0;i<=n+1;++i)
a[i][0]=a[i][m+1]=d[i][0]=d[i][m+1]=-1;
for (j=0;j<=m+1;++j)
a[0][j]=a[n+1][j]=d[0][j]=d[n+1][j]=-1;
while (!lin.empty()) {
x=lin.front(),y=col.front();
for (int p=0;p<4;++p) {
l=x+dx[p];
c=y+dy[p];
if (a[l][c]==0 && d[l][c]==0) {
d[l][c]=d[x][y]+1;
lin.push(l);
col.push(c);
}
}
lin.pop(),col.pop();
}
st=1,dr=n*m;
while (st<=dr) {
mij=(st+dr)/2;
if (Lee(mij)) sol=max(sol,mij),st=mij+1;
else dr=mij-1;
}
g<<sol;
return 0;
}