Submission #516590

#TimeUsernameProblemLanguageResultExecution timeMemory
516590whitedragonTracks in the Snow (BOI13_tracks)C++17
100 / 100
1859 ms221664 KiB
#include<iostream>
#include<vector>
#include<queue>

#define ll long long

using namespace std;

void bfs_0_1(vector<vector<int>>& tab,vector<vector<ll>>& disance,int n,int m)
{
    //dis -1
    deque<pair<int,int>> Q;

    disance[1][1]=0;
    Q.push_back(make_pair(1,1));

    while (!Q.empty())
    {
        int i=Q.front().first;
        int j=Q.front().second;
        Q.pop_front();

        if(i>1)
        {
            if(tab[j][i-1]!=0)
            {
                int val;
                if(tab[j][i]==tab[j][i-1])
                {
                    val=0;
                }
                else
                {
                    val=1;
                }

                if(disance[j][i-1]>disance[j][i]+val || disance[j][i-1]==-1)
                {
                    disance[j][i-1]=disance[j][i]+val;
                    if(val==0)
                    {
                        Q.push_front(make_pair(i-1,j));
                    }
                    else
                    {
                        Q.push_back(make_pair(i-1,j));
                    }
                }

            }
        }

        if(i<n)
        {
            if(tab[j][i+1]!=0)
            {
                int val;
                if(tab[j][i]==tab[j][i+1])
                {
                    val=0;
                }
                else
                {
                    val=1;
                }

                if(disance[j][i+1]>disance[j][i]+val || disance[j][i+1]==-1)
                {
                    disance[j][i+1]=disance[j][i]+val;
                    if(val==0)
                    {
                        Q.push_front(make_pair(i+1,j));
                    }
                    else
                    {
                        Q.push_back(make_pair(i+1,j));
                    }
                }

            }
        }

        if(j>1)
        {
            if(tab[j-1][i]!=0)
            {
                int val;
                if(tab[j][i]==tab[j-1][i])
                {
                    val=0;
                }
                else
                {
                    val=1;
                }

                if(disance[j-1][i]>disance[j][i]+val || disance[j-1][i]==-1)
                {
                    disance[j-1][i]=disance[j][i]+val;
                    if(val==0)
                    {
                        Q.push_front(make_pair(i,j-1));
                    }
                    else
                    {
                        Q.push_back(make_pair(i,j-1));
                    }
                }

            }
        }

        if(j<m)
        {
            if(tab[j+1][i]!=0)
            {
                int val;
                if(tab[j][i]==tab[j+1][i])
                {
                    val=0;
                }
                else
                {
                    val=1;
                }

                if(disance[j+1][i]>disance[j][i]+val || disance[j+1][i]==-1)
                {
                    disance[j+1][i]=disance[j][i]+val;
                    if(val==0)
                    {
                        Q.push_front(make_pair(i,j+1));
                    }
                    else
                    {
                        Q.push_back(make_pair(i,j+1));
                    }
                }

            }
        }
    }
    

}

int main()
{
    int n,m;
    cin>>n>>m;

    vector<int> base(n+1,0);
    vector<vector<int>> tab(m+1,base);

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            //tab[j][i]
            char a;
            cin>>a;

            if(a=='R')
            {
                tab[j][i]=1;
            }
            else if (a=='F')
            {
                tab[j][i]=2;
            }
            
        }
    }

    vector<ll> base_1(n+1,-1);
    vector<vector<ll>> distance(m+1,base_1);

    bfs_0_1(tab,distance,n,m);

    ll max_dis=0;

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            //cout<<distance[j][i]<<" ";
            max_dis=max(max_dis,distance[j][i]);
        }
    }

    cout<<max_dis+1<<endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...