Pagini recente » Cod sursa (job #2890946) | Cod sursa (job #2331528) | Cod sursa (job #1781335) | Cod sursa (job #178531) | Cod sursa (job #2059648)
#include <stdio.h>
#include <stdlib.h>
char v[1002][1002];
int dragoni[1000000][2];
char dirl[4]={-1,0,1,0};
char dirc[4]={0,1,0,-1};
int lee[1000000][2];
char marc[1001][1001];
int sl,sc,fl,fc;
void reset(){
int i,j;
for(i=1;i<11;i++)
for(j=1;j<11;j++)
marc[i][j]=0;
}
char check(int acc){
int i=0,k=1,j;
lee[0][0]=sl;
lee[0][1]=sc;
while(i<k && (lee[i][0]!=fl || lee[i][1]!=fc)){
for(j=0;j<4;j++)
{
if(v[lee[i][0]+dirl[j]][lee[i][1]+dirc[j]]>acc && marc[lee[i][0]+dirl[j]][lee[i][1]+dirc[j]]==0){
lee[k][0]=lee[i][0]+dirl[j];
lee[k][1]=lee[i][1]+dirc[j];
marc[lee[i][0]+dirl[j]][lee[i][1]+dirc[j]]=1;
k++;
}
}
i++;
}
if(lee[i][0]==fl && lee[i][1]==fc)
return 1;
return 0;
}
int main()
{
int i,j,k=0,l,c,r,p;
char ch;
FILE*fi,*fo;
fi=fopen("barbar.in","r");
fo=fopen("barbar.out","w");
fscanf(fi,"%d%d",&l,&c);
fgetc(fi);
for(i=1; i<=l; i++)
{
for(j=1; j<=c; j++)
{
ch=fgetc(fi);
if(ch=='I')
{
sl=i;
sc=j;
}
else if(ch=='O')
{
fl=i;
fc=j;
}
else if(ch=='D')
{
dragoni[k][0]=i;
dragoni[k][1]=j;
v[i][j]=1;
k++;
}
else if(ch=='*')
v[i][j]=-1;
}
fgetc(fi);
}
for(i=0; i<=l+1 || i<=c+1; i++)
{
v[i][0]=-1;
v[i][c+1]=-1;
v[0][i]=-1;
v[l+1][i]=-1;
}
i=0;
while(i<k){
for(j=0;j<4;j++)
{
if(v[dragoni[i][0]+dirl[j]][dragoni[i][1]+dirc[j]]==0){
dragoni[k][0]=dragoni[i][0]+dirl[j];
dragoni[k][1]=dragoni[i][1]+dirc[j];
k++;
v[dragoni[i][0]+dirl[j]][dragoni[i][1]+dirc[j]]=v[dragoni[i][0]][dragoni[i][1]]+1;
}
}
i++;
}
r=0;
p=1<<12;
while(p>0)
{
if(check(r+p)==1)
r+=p;
reset();
p/=2;
}
if(v[sl][sc]-1<r)
r=v[sl][sc]-1;
fprintf(fo,"%d",r);
fclose(fi);
fclose(fo);
return 0;
}