Pagini recente » Cod sursa (job #161984) | Cod sursa (job #2828606) | Cod sursa (job #1005851) | Cod sursa (job #2648172) | Cod sursa (job #2330663)
#include <iostream>
#include <fstream>
#include <cstring>
#include<queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
short int DMap[1000][1000], CopyMap[1000][1000], dI, dJ, PLocI, PLocJ, FLocI, FLocJ, LastDragonIndex=-1;
short int di[4]={0,0,1,-1};
short int dj[4]={1,-1,0,0};
queue < pair< int, int > > coada;
pair< int, int> Dragons[1000000];
void MapRead()
{
char aux[1001];
unsigned short int i,j;
for(i=0; i<dI;i++)
{
in.getline(aux, 1001);
for(j=0;j<strlen(aux);j++)
{
switch (aux[j])
{
case 'O':
{
DMap[i][j]= 4;
FLocI=i;
FLocJ=j;
break;
}
case '.':
{
DMap[i][j]= 0;
break;
}
case 'D':
{
DMap[i][j]= -2;
Dragons[++LastDragonIndex].first=i;
Dragons[LastDragonIndex].second=j;
break;
}
case 'I':
{
DMap[i][j]= 3;
PLocI=i;
PLocJ=j;
break;
}
case '*':
{
DMap[i][j]= -1;
break;
}
}
}
}
}
void MapOut()
{
for(int i=0;i<dI;i++)
{
for(int j=0;j<dJ;j++)
cout<<CopyMap[i][j]<<" ";
cout<<'\n';
}
}
bool OK(int i, int j)
{
if(i < 0 || j < 0 || i > dI || j >dJ)
return false;
if( CopyMap[i][j]==-1 || CopyMap[i][j]==-2)
return false;
return true;
}
void Lee()
{
int i, j, i_next, j_next;
CopyMap[PLocI][PLocJ]=1;
coada.push(make_pair(PLocI, PLocJ));
while(!coada.empty())
{
i=coada.front().first;
j=coada.front().second;
coada.pop();
for(int directie=0;directie<4;directie++)
{
i_next = i + di[directie];
j_next = j+ dj[directie];
if(OK(i_next, j_next) && CopyMap[i_next][j_next]==0)
{
CopyMap[i_next][j_next] = CopyMap[i][j] + 1;
coada.push(make_pair(i_next,j_next));
}
}
}
}
void CloneMap()
{
for( int i =0; i<= dI;i++)
for (int j=0; j<=dJ; j++)
CopyMap[i][j]= DMap[i][j];
}
bool CheckResult()
{
for(int directie = 0;directie< 4;directie++)
{
if(OK(FLocI + di[directie], FLocJ + dj[directie]) && CopyMap[FLocI+ di[directie]][ FLocJ + dj[directie]]!=0)
return true;
}
return false;
}
void GrowDragon()
{
short int LastDragonIndexCopy = LastDragonIndex;
for(int i=0;i<=LastDragonIndexCopy;i++)
{
for(int directie=0; directie<4; directie++)
if(OK(Dragons[i].first+di[directie], Dragons[i].second+dj[directie]))
{
DMap[Dragons[i].first+di[directie]][Dragons[i].second+dj[directie]]=-2;
Dragons[++LastDragonIndex].first=Dragons[i].first+di[directie];
Dragons[LastDragonIndex].second=Dragons[i].second+dj[directie];
}
}
}
int main()
{
short int DMin=0;
in>> dI>>dJ;
in.ignore();
MapRead();
do{
CloneMap();
Lee();
DMin++;
GrowDragon();
}while (CheckResult());
if(DMin-1 == 0)
out<<-1;
else out<<DMin-1;
return 0;
}