Cod sursa(job #718867)

Utilizator SpiriFlaviuBerbecariu Flaviu SpiriFlaviu Data 21 martie 2012 10:36:29
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.66 kb
#include <fstream>
#include <queue>
#include <iomanip>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int di[]={1,-1,0,0};
const int dj[]={0,0,1,-1};
struct poz
{
    int i;
    int j;
    poz()
    {
        i=j=0;
    }
    poz(int L, int C)
    {
       i=L;
       j=C;
    }
};
queue<poz> q;
queue<poz> vecin;
poz start,final;
int a[1001][1001],n,m;
bool mat[1001][1001];
bool inside(int i, int j)
{
    return i>=1 && j>=1 && i<=n && j<=m;
}
int main()
{
    int i,j,k;
    char car;
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            fin>>car;
            if(car=='*')
                a[i][j]=-2;
            else if(car=='D')
            {
                a[i][j]=1;
                q.push(poz(i,j));
            }
            else if(car=='I')
            {
                start.i=i;
                start.j=j;
            }
            else if(car=='O')
            {
                final.i=i;final.j=j;
            }
        }
    /*while(!q.empty())
    {
        fout<<q.front().i<<' '<<q.front().j<<'\n';
        q.pop();
    }*/
    while(!q.empty())
    {
        i=q.front().i;
        j=q.front().j;
        for(k=0;k<4;k++)
            if(inside(i+di[k],j+dj[k]) && a[i+di[k]][j+dj[k]]==0)
            {
                q.push(poz(i+di[k],j+dj[k]));
                a[i+di[k]][j+dj[k]]=a[i][j]+1;
            }
        q.pop();
    }
    /*for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
            fout<<setw(2)<<a[i][j]<<' ';
        fout<<'\n';
    }
	fout<<'\n';
	for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
            fout<<setw(2)<<mat[i][j]<<' ';
        fout<<'\n';
    }*/
	q.push(poz(start.i,start.j));
	mat[start.i][start.j]=true;
	poz maxpoz;
	int dmin=a[start.i][start.j];
	bool gasit=false;
	while(!gasit)
	{
		while(!q.empty() && !gasit)
		{
			i=q.front().i;
			j=q.front().j;
			for(k=0;k<4;k++)
			{
				
				if(inside(i+di[k],j+dj[k]) && a[i+di[k]][j+dj[k]]>1 &&a[i+di[k]][j+dj[k]]>=dmin && mat[i+di[k]][j+dj[k]]==false)
				{
					q.push(poz(i+di[k],j+dj[k]));
					mat[i+di[k]][j+dj[k]]=true;
					if(i+di[k]==final.i && j+dj[k]==final.j)
						gasit=true;
				}
				else if(inside(i+di[k],j+dj[k]) && a[i+di[k]][j+dj[k]]>1 && a[i+di[k]][j+dj[k]]==dmin-1 && mat[i+di[k]][j+dj[k]]==false)
					vecin.push(poz(i+di[k],j+dj[k]));
					
			}
			q.pop();
		}
		
		if(!gasit)
		{
			while(!vecin.empty())
			{
				q.push(poz(vecin.front().i,vecin.front().j));
				vecin.pop();
			}
			dmin--;
		}			
	}
	fout<<dmin-1<<'\n';
    fin.close();
    fout.close();
    return 0;
}