Challenge: Lexicographic paths
Subdomeniu: Combinatorics (combinatorics)
Scor cont: 50.0 / 50
Submission status: Accepted
Submission score: 1.0
Submission ID: 464734651
Limbaj: cpp14
Link challenge: https://www.hackerrank.com/challenges/lexicographic-steps/problem
Cerinta
Krishnakant is standing at $(0,0)$ in the [Cartesian plane](http://en.wikipedia.org/wiki/Cartesian_coordinate_system). He wants to go to the point $(x,y)$ in the same plane using only horizontal and vertical moves of $1$ unit. There are many ways of doing this, and he is writing down all such ways. Each way comprises of few $H$ moves and few $V$ moves. i.e. moves in horizontal and vertical direction respectively. For example, if Krishnakant wants to go to point $(2,2)$ from point $(0,0)$, $HVHV$ is one of the possible ways.
Given the value of $K$, he wants to know lexicographically $K^{th}$ smallest way of going to $(x,y)$ from $(0,0)$.
**Input Format**
The first line contains an integer $T$ , i.e., number of test cases.
Next $T$ lines will contain integers $x$,$y$ and $K$.
**Output Format**
For each test case, print lexicographically $K^{th}$ smallest path.
**Constraints**
$1 \le T \le 100000$
$1 \le x \le 10$
$1 \le y \le 10$
$0 \le K < \text{number of paths}$
**Sample Input**
2
2 2 2
2 2 3
**Sample Output**
HVVH
VHHV
**Explanation**
All the paths of going to $(2,2)$ from $(0,0)$ in lexicographically increasing order:<br><br>
$0. HHVV$<br>
$1. HVHV$<br>
$2. HVVH$<br>
$3. VHHV$<br>
$4. VHVH$<br>
$5. VVHH$<br>
Cod sursa
//lexicographic-steps.cpp
//Lexicographic paths
//Weekly Challenges - Week 9
//Author: derekhh
#include<cstdio>
using namespace std;
int n, m;
int c[21][21];
void init()
{
for (int i = 1; i <= 20; i++)
{
c[i][0] = c[i][i] = 1;
for (int j = 1; j < i; j++)
c[i][j] = c[i - 1][j] + c[i - 1][j - 1];
}
}
int main()
{
init();
int t;
scanf("%d", &t);
while (t--)
{
int k;
scanf("%d%d%d", &n, &m, &k);
int cx = 0, cy = 0;
while (cx != n || cy != m)
{
int nH = n - cx, nV = m - cy;
if (nH == 0)
{
printf("V");
cy++;
}
else if (nV == 0)
{
printf("H");
cx++;
}
else
{
int temp = c[nH + nV - 1][nH - 1];
if (k >= temp && temp > 0)
{
printf("V");
k -= temp;
cy++;
}
else
{
printf("H");
cx++;
}
}
}
printf("\n");
}
return 0;
}
HackerRank Combinatorics – Lexicographic paths
