Cod sursa(job #1064943)

Utilizator miu_mik93FMI - Paduraru Miruna miu_mik93 Data 22 decembrie 2013 15:33:50
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.19 kb
#include <iostream>
#include <string>
#include <stdlib.h>
#include <assert.h>
#include <time.h>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <fstream>
#include <queue>
#include <cstdlib>
#include <iomanip>
#include <cmath>
#include <stdarg.h>
#include <stdio.h>
#include <set>
using namespace std;
//#include <unordered_map>
#define NMAX 10001

int dx[] = {0, 0, -1, 1};
int dy[] = {-1, 1, 0, 0};

deque<pair< int, int> > Q, C;
int r, c, a[NMAX][NMAX], starti, startj, finishi, finishj, isOK, d[NMAX][NMAX];
char caracter;

void BFS ()
{
	while ( !Q.empty() )
    {

        int x = Q.front().first;
        int y = Q.front().second;
		Q.pop_front ();
        
		for ( int k = 0; k < 4; k++ )
        {
           int xi = x + dx[k], xj = y + dy[k];
           if ( xi < r && xj < c && xi >= 0 && xj >= 0 && a[xi][xj] == 0 )
           {
				if( a[x][y] == -2 )
					a[xi][xj] = 1;
                else
				{
                    a[xi][xj] = a[x][y] + 1;
                }
				 Q.push_back (make_pair ( xi, xj ));
            }
        }
	}

}

void BFSforQuestion ()
{
	int k,x,y;
    
	if( starti == finishi && startj == finishj )
        isOK = 1;

	C.push_front (make_pair(starti, startj));

	while( !C.empty() )
	{

		x = C.front().first;
		y = C.front().second;
		C.pop_front();
		
		for( int k = 0; k < 4; k++)
		{
			if( ( d[x + dx[k]][y + dy[k]] == 0 ) && a[x + dx[k]][y + dy[k]] > 0 && x + dx[k] < r && y + dy[k] < c && x + dx[k] >= 0 && y + dy[k] >= 0 )
			{
				if( x + dx[k] == finishi && y + dy[k] == finishj )
					isOK=1;
				if( a[x + dx[k]][y + dy[k]] >= d[x][y] )
				{
					d[x + dx[k]][y + dy[k]] = d[x][y];
					C.push_front( make_pair (x + dx[k], y + dy[k]) );
				}
				else
				{
					d[x + dx[k]][y + dy[k]] = a[x + dx[k]][y + dy[k]];
					C.push_back( make_pair (x + dx[k], y + dy[k]) );
				}
		}
    }
}
}

int main ()
{
	FILE *f = fopen ("barbar.in", "r");
	FILE *g = fopen ("barbar.out", "w");

	fscanf (f, "%d %d",&r, &c); 
	char x;

	for (int i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
		{
			fscanf (f, "%c", &x);
			if (x == '\n')
				fscanf (f, "%c", &caracter);
			else
				caracter = x;
			if ( caracter == '*' )
				a[i][j] = -1;
			else
				if ( caracter == '.' )
					a[i][j] = 0;
				else
					if ( caracter == 'D' )
					{
						a[i][j] = -2;
						Q.push_back (make_pair(i, j));
					}
					else
						if ( caracter == 'I' )
						{
							a[i][j] = 0;
							starti = i; startj = j;
						}
						else
							if ( caracter == 'O' )
							{
								a[i][j] = 0;
								finishi = i; finishj = j;
							}
		}
	}

	BFS();

	/*starti = 1; startj = 1;
	finishi = 8; finishj = 3;
	for(int i = 0; i < r; i++)
        for(int j = 0; j < c; j++)
            d[i][j] = 0;*/
    d[starti][startj] = a[starti][startj];
   
	BFSforQuestion();

	/*for (int i = 0; i < r; i++)
	{
		for (int j = 0; j < r; j++)
		{
			fprintf (g, "%d ", d[i][j]);
		}
		fprintf (g, "\n");
	}*/

    if ( isOK == 1 )
        fprintf (g, "%d", d[finishi][finishj]);
    else
		fprintf (g, "%d", -1);

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