Pagini recente » Cod sursa (job #2902224) | Cod sursa (job #2754811) | Cod sursa (job #285212) | Cod sursa (job #2435295) | Cod sursa (job #1127615)
#include <iostream>
#include <queue>
#include <fstream>
#include <cstring>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int d[1005][1005], ma[1005][1005];
const int dlin[] = { -1 , 0 , 1 , 0 };
const int dcol[] = { 0 , 1 , 0 , -1 };
struct pozitie{
int lin , col;
};
queue<pozitie>q;
void lee(pozitie x0)
{
pozitie x , y;
ma[x0.lin][x0.col]=1;
q.push(x0);
while(!q.empty())
{
x=q.front();
q.pop();
for(int i=0;i<4;i++)
{
y.lin=x.lin+dlin[i];
y.col=x.col+dcol[i];
if(ma[y.lin][y.col]==0)
{
ma[y.lin][y.col]=1+ma[x.lin][x.col];
q.push(y);
}
}
}
}
int main()
{
int n, m , i , j , poz1,poz2,ii1,ii2;
char c[1005] , ca;
in>>n;
in>>m;
for(i=0;i<=n+1;i++)
{
d[i][0]=-1;
d[i][m+1]=-1;
}
for(i=0;i<=m+1;i++)
{
d[0][i]=-1;
d[n+1][i]=-1;
}
for(i=0;i<n;i++)
{
in.getline(c,1005);
for(j=0;j<m;j++)
{
ca=c[j];
if(ca=='D')
d[i][j+1]=-2;
if(ca=='I')
{
ii1=i;
ii2=j+1;
}
if(ca=='O')
{
poz1=i;
poz2=j+1;
}
if(ca=='*')
d[i][j+1]=-1;
}
}
int w=0 , i1, j1;
do{
for(i=0;i<=n+1;i++)
{
for(j=0;j<=m+1;j++)
{
ma[i][j]=d[i][j];
}
}
for(i=0;i<=n+1;i++)
{
for(j=0;j<=m+1;j++)
{
if(ma[i][j]==-2)
{
if(w!=0){
for(int h=0;h<4;h++)
{
i1=i;
j1=j;
for(int hh=0;hh<w;hh++)
{
if((i+dlin[h]!=poz1)&&(j+dcol[h]!=poz2)&&(i+dlin[h]!=ii1)&&(j+dcol[h]!=112)&&((i+dlin[h]!=-2)||(j+dcol[h]!=-2)))
{ma[i1+dlin[h]][j1+dcol[h]]=-1;
i1=i1+dlin[h];
j1=j1+dcol[h];
}
}
}
}
}
}
}
lee((pozitie){ii1,ii2});
w++;
}while(ma[poz1][poz2]!=0);
/*for(i=0;i<=n+1;i++)
{
for(j=0;j<=m+1;j++)
{
out<<ma[i][j]<<" ";
}
out<<'\n';
}*/
out<<w-2;
in.close();
out.close();
return 0;
}