Pagini recente » Cod sursa (job #3132176) | Cod sursa (job #2874609) | Cod sursa (job #2964034) | Cod sursa (job #285882) | Cod sursa (job #2527802)
#include <bits/stdc++.h>
using namespace std;
ifstream ci("barbar.in");
ofstream cou("barbar.out");
struct coord
{
int x,y;
};
coord fin,intr;
int n,m,v[1001][1001],dragoni[1001][1001],lee[1001][1001];
short coordx[5]= {-1,0,1,0};
short coordy[5]= {0,1,0,-1};
queue<coord>drg;
queue<coord>q;
void citire()
{
ci>>n>>m;
int i,j;
char a;
coord w;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
ci>>a;
if(a=='.')
{
v[i][j]=0;
}
if(a=='I' )
{
w.x=i;
w.y=j;
intr=w;
q.push(w);
v[i][j]=1;
}
if(a=='D' ){
w.x=i;
w.y=j;
drg.push(w);
v[i][j]=1;
}
if(a=='*' ){
v[i][j]=1;
}
if(a=='O' ){
fin.x=i;
fin.y=j;
}
}
}
}
bool Ok(int i,int j){
if(i>=1&&j>=1&&i<=n&&j<=m){
return 1;
}
return 0;
}
void Leedragoni(){
coord w,w1;
while(!drg.empty()){
w=drg.front();
drg.pop();
for(int i=0;i<=3;i++){
w1.x=w.x+coordx[i];
w1.y=w.y+coordy[i];
if(Ok(w1.x,w1.y)){
if(dragoni[w1.x][w1.y]==0||dragoni[w1.x][w1.y]>dragoni[w.x][w.y]+1 ){
drg.push(w1);
dragoni[w1.x][w1.y]=dragoni[w.x][w.y]+1;
}
}
}
}
}
void Lee(int k){
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
lee[i][j]=0;
}
}
coord w,w1;
while(!q.empty()){
w=q.front();
q.pop();
if(dragoni[w.x][w.y]<k ){
return;
}
for(int i=0;i<=3;i++){
w1.x=w.x+coordx[i];
w1.y=w.y+coordy[i];
if(Ok(w1.x,w1.y)){
if(dragoni[w1.x][w1.y]>=k ){
if(v[w1.x][w1.y]!=1 ){
if(lee[w1.x][w1.y]==0||lee[w1.x][w1.y]>lee[w.x][w.y]+1 ){
q.push(w1);
lee[w1.x][w1.y]=lee[w.x][w.y]+1;
}
}
}
}
}
}
}
void rez(){
int st=1,dr=n*m+3;
int mij;
int i,j,veri=0,sol;
while(st<=dr){
mij=(st+dr)/2;
q.push(intr);
Lee(mij);
if(lee[fin.x][fin.y]==0 ){
dr=mij-1;
}else{
st=mij+1;
veri=1;
sol=mij;
}
}
if(veri==0){
Lee(1);
if(lee[fin.x][fin.y]!=0 ){
cou<<1;
}else{
cou<<-1;
}
}else{
Lee(sol-1);
if(lee[fin.x][fin.y]!=0 ){
cou<<sol-1;
}else{
cou<<sol;
}
}
}
int main()
{
int i,j;
citire();
Leedragoni();
rez();
return 0;
}