198B. Jumping on Walls - Codeforces Solution C++

  Problem Link : 198B. Jumping on Walls 


✅ C++ Solution :

 
#include<bits/stdc++.h>
using namespace std;

char lefty[100001];
char righty[100001];

bool flag=0;

void dfs(int v,bool wall,bool visitl[],bool visitr[],int n,int time,int k)
{
    cout<<v<<" "<<wall<<endl;
    if(v+k>n)
    {
        flag=1;
        return;
    }
    if(!wall)
    {
        if(!visitl[v+1] && lefty[v+1]!='X')
        {
            visitl[v+1]=1;
            dfs(v+1,wall,visitl,visitr,n,time+1,k);
        }
        if(!visitl[v-1] && lefty[v-1]!='X' && v-1>time+1)
        {
            visitl[v-1]=1;
            dfs(v-1,wall,visitl,visitr,n,time+1,k);
        }
         if(!visitr[v+k] && righty[v+k]!='X')
        {
            visitr[v+k]=1;
            dfs(v+k,1,visitl,visitr,n,time+1,k);
        }
    }
    else
    {
        if(!visitr[v+1] && righty[v+1]!='X')
        {
            visitr[v+1]=1;
            dfs(v+1,wall,visitl,visitr,n,time+1,k);
        }
        if(!visitr[v-1] && righty[v-1]!='X' && v-1>time+1)
        {
            visitr[v-1]=1;
            dfs(v-1,wall,visitl,visitr,n,time+1,k);
        }
         if(!visitl[v+k] && lefty[v+k]!='X')
        {
            visitl[v+k]=1;
            dfs(v+k,0,visitl,visitr,n,time+1,k);
        }
    }
    
}

void bfs(int v,bool wall,bool visitl[],bool visitr[],int n,int time,int k)
{
    time=0;
    queue<pair<int,int> >q;
    q.push(make_pair(1,0));
    
    while(!q.empty())
    {
        int size=q.size();
        while(size--)
        {
            int v = q.front().first;
            wall=q.front().second;
            q.pop();
            if(v+k>n)
            {
                flag=1;
                return;
            }
             if(!wall)
            {
                if(!visitl[v+1] && lefty[v+1]!='X')
                {
                    visitl[v+1]=1;
                    q.push(make_pair(v+1,0));
                }
                if(!visitl[v-1] && lefty[v-1]!='X' && v-1>time+1)
                {
                    visitl[v-1]=1;
                    q.push(make_pair(v-1,0));
                }
                 if(!visitr[v+k] && righty[v+k]!='X')
                {
                    visitr[v+k]=1;
                    q.push(make_pair(v+k,1));
                }
            }
            else
            {
                if(!visitr[v+1] && righty[v+1]!='X')
                {
                    visitr[v+1]=1;
                    q.push(make_pair(v+1,1));
                }
                if(!visitr[v-1] && righty[v-1]!='X' && v-1>time+1)
                {
                    visitr[v-1]=1;
                    q.push(make_pair(v-1,1));
                }
                 if(!visitl[v+k] && lefty[v+k]!='X')
                {
                    visitl[v+k]=1;
                   q.push(make_pair(v+k,0));
                }
            }
            
        }    
        time++;
        
    }
    
    
}


int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>lefty[i];
    for(int i=1;i<=n;i++)
        cin>>righty[i];
    bool visitl[n+1]={0},visitr[n+1]={0};
    visitl[1]=1;
    bfs(1,0,visitl,visitr,n,0,k);  
    
    if(flag)
        cout<<"YES";
    else
        cout<<"NO";    
    
}

 

Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook. 

😇Happy Learning!!