Pagini recente » Cod sursa (job #2918019) | Cod sursa (job #2882431) | Cod sursa (job #1356729) | Cod sursa (job #851828) | Cod sursa (job #363513)
Cod sursa(job #363513)
#include<fstream.h>
int d[101][101],b[101][101];
int main()
{int r1,r2,s,c1,c2,a,j,f,i=1,lmax,n,n2,nd=0,ld1[10001],ld2[10001],lee1[10001],lee2[10001];
char m[101][101];
ifstream q("barbar.in");
ofstream w("barbar.out");
q>>n>>n2;
for(i=1;i<=n;i++)
{q>>m[i]+1;
for(j=1;j<=n2;j++)
{if(m[i][j]=='D')
{nd++;
ld1[nd]=i;
ld2[nd]=j;}
if(m[i][j]=='I')
{c1=i;
c2=j;}
if(m[i][j]=='O')
{r1=i;
r2=j;}}}
for(f=1;f<=nd;f++)
{lmax=1;
lee1[1]=ld1[f];
lee2[1]=ld2[f];
d[lee1[1]][lee2[1]]=0;
for(a=1;a<=lmax;a++)
{i=lee1[a];
j=lee2[a];
if(i>1&&m[i-1][j]=='.'&&(d[i-1][j]==0||d[i-1][j]>d[i][j]+1))
{d[i-1][j]=d[i][j]+1;
lmax++;
lee1[lmax]=i-1;
lee2[lmax]=j;}
if(j>1&&m[i][j-1]=='.'&&(d[i][j-1]==0||d[i][j-1]>d[i][j]+1))
{d[i][j-1]=d[i][j]+1;
lmax++;
lee1[lmax]=i;
lee2[lmax]=j-1;}
if(i<n&&m[i+1][j]=='.'&&(d[i+1][j]==0||d[i+1][j]>d[i][j]+1))
{d[i+1][j]=d[i][j]+1;
lmax++;
lee1[lmax]=i+1;
lee2[lmax]=j;}
if(j<n&&m[i][j+1]=='.'&&(d[i][j+1]==0||d[i][j+1]>d[i][j]+1))
{d[i][j+1]=d[i][j]+1;
lmax++;
lee1[lmax]=i;
lee2[lmax]=j+1;}}}
lee1[1]=c1;
lee2[1]=c2;
int nr,in=1;
s=n;
while(in<s)
{nr=in-1+((s-in+1)/2);
lmax=1;
for(d[0][0]=1;d[0][0]<=n;d[0][0]++)
for(d[0][1]=1;d[0][1]<=n2;d[0][1]++)
b[d[0][0]][d[0][1]]=0;
for(a=1;a<=lmax;a++)
{i=lee1[a];
j=lee2[a];
if(i>1&&(d[i-1][j]>=nr||d[i][j-1]==0)&&(m[i-1][j]=='.'||m[i][j+1]=='O')&&(b[i-1][j]==0||b[i-1][j]>b[i][j]+1))
{b[i-1][j]=b[i][j]+1;
lmax++;
lee1[lmax]=i-1;
lee2[lmax]=j;}
if(j>1&&(d[i][j-1]>=nr||d[i][j-1]==0)&&(m[i][j-1]=='.'||m[i][j+1]=='O')&&(b[i][j-1]==0||b[i][j-1]>b[i][j]+1))
{b[i][j-1]=b[i][j]+1;
lmax++;
lee1[lmax]=i;
lee2[lmax]=j-1;}
if(i<n&&(d[i+1][j]>=nr||d[i+1][j]==0)&&(m[i+1][j]=='.'||m[i][j+1]=='O')&&(b[i+1][j]==0||b[i+1][j]>b[i][j]+1))
{b[i+1][j]=b[i][j]+1;
lmax++;
lee1[lmax]=i+1;
lee2[lmax]=j;}
if(j<n&&(d[i][j+1]>=nr||d[i][j+1]==0)&&(m[i][j+1]=='.'||m[i][j+1]=='O')&&(b[i][j+1]==0||b[i][j+1]>b[i][j]+1))
{b[i][j+1]=b[i][j]+1;
lmax++;
lee1[lmax]=i;
lee2[lmax]=j+1;}}
if(b[r1][r2]!=0)
{if(in!=nr)
in=nr;
else
in=nr+1;}
if(b[r1][r2]==0)
{if(in!=nr)
s=nr;
else
in=nr+1;}}
w<<nr;
return 0;}