Pagini recente » Cod sursa (job #858462) | Cod sursa (job #747737) | Cod sursa (job #2584249) | Cod sursa (job #1233665) | Cod sursa (job #780818)
Cod sursa(job #780818)
#include<fstream>
#include<queue>
#include<algorithm>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int m,n,i,j,psi,x,y,v;
int a[1001][1001];
int b[1001][1001];
int x_source,y_source,x_destination,y_destination,sol;
struct point{int xd; int yd;};
queue<point> Q;
point p,q;
char c;
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
/*void afisare()
{for(i=1; i<=m; i++)
{for(j=1; j<=n; j++)
g<<a[i][j]<<" ";
g<<endl;}
g<<endl<<endl;} */
int algoritmul_lui_Lee(int vmin)
{p.xd=x_source; p.yd=y_source;
Q.push(p);
while(!Q.empty())
{p=Q.front();
x=p.xd; y=p.yd;
Q.pop();
for(psi=0; psi<4; psi++)
if(b[x+dx[psi]][y+dy[psi]]>=0 && b[x+dx[psi]][y+dy[psi]]!=vmin && a[x+dx[psi]][y+dy[psi]]>=vmin)
{b[x+dx[psi]][y+dy[psi]]=vmin;
q.xd=x+dx[psi]; q.yd=y+dy[psi];
Q.push(q);
if(q.xd==x_destination && q.yd==y_destination)
{while(!Q.empty()) Q.pop();
return 1;}
}
}
return 0;
}
void cautare_binara(int left, int right)
{if(left==right)
{if(algoritmul_lui_Lee(left))
sol=left;
else
sol=left-1;
return;}
int mid=(left+right)/2;
if(algoritmul_lui_Lee(mid)==0)
cautare_binara(left,mid);
else
cautare_binara(mid+1,right);
}
int main()
{
f>>m>>n;
for(i=1; i<=m; i++)
a[i][n+1]=a[i][0]=b[i][n+1]=b[i][0]=-1;
for(j=1; j<=n; j++)
a[m+1][j]=a[0][j]=b[m+1][j]=b[0][j]=-1;
for(i=1; i<=m; i++)
for(j=1; j<=n; j++)
{f>>c;
if(c=='I')
{x_source=i;
y_source=j;}
if(c=='O')
{x_destination=i;
y_destination=j;}
if(c=='*')
a[i][j]=b[i][j]=-1;
if(c=='D')
{a[i][j]=0;
b[i][j]=-2;
p.xd=i; p.yd=j;
Q.push(p);}
}
int nr=100;
while(!Q.empty())
{p=Q.front();
x=p.xd; y=p.yd; v=a[x][y];
// if(a[x][y]>maxim)
// maxim=a[x][y];
Q.pop();
for(psi=0; psi<4; psi++)
if(a[x+dx[psi]][y+dy[psi]]==0 || a[x+dx[psi]][y+dy[psi]]>v+1)
{a[x+dx[psi]][y+dy[psi]]=v+1;
q.xd=x+dx[psi]; q.yd=y+dy[psi];
Q.push(q);}
//afisare();
}
cautare_binara(1,a[x_source][y_source]);
g<<sol;
f.close();
g.close();
return 0;}