➤ Problem Link : 339C. Xenia and Weights
✅ C++ Solution :
#include<bits/stdc++.h>
using namespace std;
set<pair<int,int> > visited;
pair<int,pair<int,int> > depth[4501][4001];
bool flag = 0;
void printVal(int x,int y,bool turn , int j,int m)
{
if(j>=m)
return;
int mx = depth[x][y].second.first;
int my = depth[x][y].second.second;
if(!turn)
{
cout<<mx-x<<" ";
printVal(mx,my,1,j+1,m);
}
else
{
cout<<my-y<<" ";
printVal(mx,my,0,j+1,m);
}
}
int dfs(int x, int y, bool turn,string s,int j,int m,int prev)
{
int diff;
int dpt=0,mx=-1,my=-1;
if(flag)
return 0;
if(j==m+1)
{
flag=1;
return 0;
}
if(!turn)
{
diff = y - x;
int val;
for(int i = diff; i< 10;i++)
{
if(s[i]=='0' || i == prev-1)
continue;
if(visited.find(make_pair(x+i+1,y))==visited.end())
{
visited.insert(make_pair(x+i+1,y));
val = dfs(x+i+1,y,1,s,j+1,m,i+1);
}
else
val = depth[x+i+1][y].first;
if( val > dpt )
{
dpt=val;
mx = x+i+1;
my = y;
}
}
}
else
{
diff = x - y;
int val;
for(int i = diff; i< 10;i++)
{
if(s[i]=='0' || i==prev-1)
continue;
if(visited.find(make_pair(x,y+i+1))==visited.end())
{
visited.insert(make_pair(x,y+i+1));
val = dfs(x,y+i+1,0,s,j+1,m,i+1);
}
else
val = depth[x][y+i+1].first ;
if( val > dpt )
{
dpt=val;
mx = x;
my = y+i+1;
}
}
}
depth[x][y].first = dpt+1;
depth[x][y].second = make_pair(mx, my);
return dpt+1;
}
int main()
{
string s;
cin>>s;
int m;
cin>>m;
memset(depth,0,sizeof(depth));
visited.insert(make_pair(0,0));
int val=dfs(0,0,0,s,0,m,-1);
if(val<=m)
cout<<"NO";
else
{
cout<<"YES\n";
printVal(0,0,0,0,m);
}
}
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!!
