Cod sursa(job #2986397)

Utilizator Ilie_MityIlie Dumitru Ilie_Mity Data 28 februarie 2023 15:48:40
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<cstdio>
#include<deque>

struct pos
{
	int i, j;
};

const int NMAX=1024;

char mat[NMAX][NMAX];
int dist[NMAX][NMAX];

int main()
{
	FILE *f=fopen("barbar.in", "r"), *g=fopen("barbar.out", "w");
	int i, j, N, M, i0, j0, k;
	const int di[4]={-1, 1, 0, 0}, dj[4]={0, 0, -1, 1};
	std::deque<pos> q;
	pos p;
	bool ok=1;

	fscanf(f, "%d%d", &N, &M);
	fgets(mat[0], NMAX, f);
	for(i=0;i<N;++i)
	{
		fgets(mat[i], NMAX, f);
		for(j=0;j<M;++j)
		{
			dist[i][j]=-1;
			if(mat[i][j]=='D')
				q.push_back({i, j}), dist[i][j]=0;
			else if(mat[i][j]=='I')
				i0=i, j0=j;
		}
	}

	while(!q.empty())
	{
		p=q.front();
		q.pop_front();
		for(k=0;k<4;++k)
		{
			i=p.i+di[k];
			j=p.j+dj[k];
			if(i>-1 && i<N && j>-1 && j<M && mat[i][j]!='*' && dist[i][j]==-1)
				dist[i][j]=dist[p.i][p.j]+1, q.push_back({i, j});
		}
	}

	q.push_back({i0, j0});
	while(!q.empty() && ok)
	{
        p=q.front();
        q.pop_front();

        if(mat[p.i][p.j]=='O')
        	ok=0;
        else
			for(k=0;k<4;++k)
			{
				i=p.i+di[k];
				j=p.j+dj[k];

				if(i>-1 && i<N && j>-1 && j<M && (mat[i][j]=='.' || mat[i][j]=='O'))
				{
					if(dist[i][j]>=dist[p.i][p.j])
						q.push_front({i, j}), dist[i][j]=dist[p.i][p.j];
					else
						q.push_back({i, j});
					if(mat[i][j]!='O')
						mat[i][j]='*';
				}
			}
	}

	/*for(i=0;i<N;++i)
	{
		for(j=0;j<M;++j)
			printf("%2d ", dist[i][j]);
		printf("\n");
	}*/

	if(ok)
		dist[p.i=0][p.j=0]=-1;
	fprintf(g, "%d\n", dist[p.i][p.j]);

	fclose(f);
	fclose(g);
	return 0;
}