Cod sursa(job #1732202)

Utilizator tanasaradutanasaradu tanasaradu Data 21 iulie 2016 03:11:33
Problema Rj Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.91 kb
#include <bits/stdc++.h>
#define infinit 1000000
using namespace std;
ifstream fin("insule.in");
ofstream fout("insule.out");
char a[105][105];
int b[105][105],n,m,cnt,v[105][105],c[105][105];
queue<pair<int,int> >st;
void Citire()
{
    int i,j;
    fin>>n>>m;
    for(i=0;i<n;i++)
        fin>>a[i];
}
inline void Formare()
{
    int i,j;
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
        v[i+1][j+1]=a[i][j]-'0';
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        b[i][j]=v[i][j];
}
void Initializare()
{
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        c[i][j]=infinit;
}
inline void Bordare()
{
    int i;
    for(i=0;i<=m+1;i++)
        v[0][i]=v[n+1][i]=-1;
    for(i=0;i<=n+1;i++)
        v[i][0]=v[i][m+1]=-1;
}
inline void Fill(int i,int j,int k)
{
    st.push(make_pair(i,j));
    b[i][j]=0;
    while(!st.empty())
    {
        i=st.front().first;
        j=st.front().second;
        st.pop();
        if(b[i-1][j]==k)
        {
            b[i-1][j]=0;
            st.push(make_pair(i-1,j));
        }
        if(b[i+1][j]==k)
        {
            b[i+1][j]=0;
            st.push(make_pair(i+1,j));
        }
        if(b[i][j-1]==k)
        {
            b[i][j-1]=0;
            st.push(make_pair(i,j-1));
        }
        if(b[i][j+1]==k)
        {
            b[i][j+1]=0;
            st.push(make_pair(i,j+1));
        }
    }
}
inline void Cerinta1()
{
    int nr1=0,nr2=0,nr3=0,i,j;
    for(i=1;i<=n;i++)
    {
          for(j=1;j<=m;j++)
            if(b[i][j]==1)
            {
                Fill(i,j,1);
                nr1++;
            }
            else if(b[i][j]==2)
            {
                Fill(i,j,2);
                nr2++;
            }
            else if(b[i][j]==3)
            {
                Fill(i,j,3);
                nr3++;
            }
    }
    fout<<nr1<<" "<<nr2<<" "<<nr3<<" ";
}
inline void Lee()
{
    int i,j,x,y,k,minim=infinit;
    int dx[]={-1,0,1,0};
    int dy[]={0,1,0,-1};
    while(!st.empty())st.pop();
     for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        if(v[i][j]==0)
     {
        if(v[i][j-1]==1 || v[i][j+1]==1 || v[i-1][j]==1|| v[i+1][j]==1)
        {
            st.push(make_pair(i,j));
                c[i][j]=1;
        }
     }
     while(!st.empty())
     {
         i=st.front().first;
         j=st.front().second;
         st.pop();
         for(k=0;k<4;k++)
         {
             x=i+dx[k];
             y=j+dy[k];
             if(v[x][y]==0 and c[x][y]>(c[i][j]+1))
            {
                c[x][y]=c[i][j]+1;
                st.push(make_pair(x,y));
            }

             if(v[x][y]==2)
                minim=min(minim,c[i][j]);
         }
     }
     fout<<minim<<"\n";
}
int main()
{

    Citire();
    Formare();
    Initializare();
    Bordare();
    Cerinta1();
    Lee();
    return 0;
}