Cod sursa(job #1127615)

Utilizator stefanlaculeanuLaculeanu Stefan stefanlaculeanu Data 27 februarie 2014 13:06:45
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.62 kb
#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;
}