Pagini recente » Cod sursa (job #1216218) | Cod sursa (job #1242264) | Cod sursa (job #1076769) | Cod sursa (job #117852) | Cod sursa (job #821044)
Cod sursa(job #821044)
#include <fstream>
using namespace std;
const int N=1001;
const int dlin[]={0,1,0,-1};
const int dcol[]={1,0,-1,0};
char v[N][N];
int d[N][N],dr[N][N];
struct queue{
int lin,col;
};
queue q[N*N],start,fin,a,b;
int u,p=1,r,c;
void bfs(){
queue x,y;
while(p<=u)
{
x=q[p++];
for(int i=0;i<4;i++)
{
y.lin=x.lin+dlin[i];
y.col=x.col+dcol[i];
if(d[y.lin][y.col]==-1)
{
q[++u]=y;
d[y.lin][y.col]=1+d[x.lin][x.col];
}
}
}
}
void bfso(int obs){
queue x,y;
while(p<=u)
{
x=q[p++];
for(int i=0;i<4;i++)
{
y.lin=x.lin+dlin[i];
y.col=x.col+dcol[i];
if(d[y.lin][y.col]>=obs&&dr[y.lin][y.col]==0)
{
q[++u]=y;
dr[y.lin][y.col]=1+dr[x.lin][x.col];
}
}
}
}
void init(){
for(int i=0;i<r;i++)
for(int j=0;j<c;j++)
dr[i][j]=0;
}
int main()
{
ifstream f("barbar.in");
ofstream h("barbar.out");
int i,caut=0;
f>>r>>c>>ws;
for(i=0;i<r;i++){
f.getline(v[i],c+1);
}
for(i=0;i<r;i++)
for(int j=0;j<c;j++){
if(v[i][j]=='.')d[i][j]=-1;
if(v[i][j]=='*')d[i][j]=-2;
if(v[i][j]=='D'){
d[i][j]=0;
q[++u].lin=i;
q[u].col=j;
}
if(v[i][j]=='I'){
d[i][j]=-1;
start.lin=i;
start.col=j;
}
if(v[i][j]=='O'){
d[i][j]=-1;
fin.lin=i;
fin.col=j;
}
}
bfs();
for(int obs=1<<19;obs;obs/=2){
q[1]=start;
u=1;
p=1;
bfso(caut+obs);
if(dr[fin.lin][fin.col]&&d[start.lin][start.col]>=caut+obs)caut+=obs;
init();
}
h<<caut<<"\n";
return 0;
}