Nth positive number whose absolute difference of adjacent digits is at most 1

Given a number **N**, the task is to find the **N**^{th} number which has an absolute difference of 1 between every pair of its adjacent digits.**Examples:**

Input :N = 5Output :5Explanation:

The first 5 such numbers are 1,2,3,4 and5.Input :N = 15Output :23Explanation:

The first 15 such numbers are 1,2,3,4,5,6,7,8,9,10,11,12,21,22 and23.

**Approach:** In order to solve this problem we are using the Queue data structure.

- Prepare an empty Queue, and Enqueue all integers 1 to 9 in increasing order.

- Now perform the following operation N times.
- Dequeue and store in array
**arr**which stores ith number of required type in arr[i]. - If (arr[i] % 10 != 0), then enqueue
**10 * arr[i] + (arr[i] % 10) – 1**. - Enqueue
**10 * arr[i] + (arr[i] % 10)**. - If (arr[i] % 10 != 9), then enqueue
**10 * arr[i] + (arr[i] % 10) + 1**.

- Dequeue and store in array
- Return
**arr[N]**as the answer.

Below is the implementation of the given approach:

## C++

`// C++ Program to find Nth number with` `// absolute difference between all` `// adjacent digits at most 1.` `#include <bits/stdc++.h>` `using` `namespace` `std;` `// Return Nth number with` `// absolute difference between all` `// adjacent digits at most 1.` `void` `findNthNumber(` `int` `N)` `{` ` ` `// To store all such numbers` ` ` `long` `long` `arr[N + 1];` ` ` ` ` `queue<` `long` `long` `> q;` ` ` `// Enqueue all integers from 1 to 9` ` ` `// in increasing order.` ` ` `for` `(` `int` `i = 1; i <= 9; i++)` ` ` `q.push(i);` ` ` `// Perform the operation N times so that` ` ` `// we can get all such N numbers.` ` ` `for` `(` `int` `i = 1; i <= N; i++) {` ` ` `// Store the front element of queue,` ` ` `// in array and pop it from queue.` ` ` `arr[i] = q.front();` ` ` `q.pop();` ` ` `// If the last digit of dequeued integer is` ` ` `// not 0, then enqueue the next such number.` ` ` `if` `(arr[i] % 10 != 0)` ` ` `q.push(arr[i] * 10 + arr[i] % 10 - 1);` ` ` `// Enqueue the next such number` ` ` `q.push(arr[i] * 10 + arr[i] % 10);` ` ` `// If the last digit of dequeued integer is` ` ` `// not 9, then enqueue the next such number.` ` ` `if` `(arr[i] % 10 != 9)` ` ` `q.push(arr[i] * 10 + arr[i] % 10 + 1);` ` ` `}` ` ` ` ` `cout<<arr[N]<<endl;` `}` `// Driver Code` `int` `main()` `{` ` ` `int` `N = 21;` ` ` `findNthNumber(N);` ` ` `return` `0;` `}` |

## Java

`// Java program to find Nth number with` `// absolute difference between all` `// adjacent digits at most 1.` `import` `java.util.*;` `class` `GFG{` `// Return Nth number with` `// absolute difference between all` `// adjacent digits at most 1.` `static` `void` `findNthNumber(` `int` `N)` `{` ` ` ` ` `// To store all such numbers` ` ` `int` `[]arr = ` `new` `int` `[N + ` `1` `];` ` ` ` ` `Queue<Integer> q = ` `new` `LinkedList<>();` ` ` `// Enqueue all integers from 1 to 9` ` ` `// in increasing order.` ` ` `for` `(` `int` `i = ` `1` `; i <= ` `9` `; i++)` ` ` `q.add(i);` ` ` `// Perform the operation N times so` ` ` `// that we can get all such N numbers.` ` ` `for` `(` `int` `i = ` `1` `; i <= N; i++)` ` ` `{` ` ` ` ` `// Store the front element of queue,` ` ` `// in array and pop it from queue.` ` ` `arr[i] = q.peek();` ` ` `q.remove();` ` ` ` ` `// If the last digit of dequeued` ` ` `// integer is not 0, then enqueue` ` ` `// the next such number.` ` ` `if` `(arr[i] % ` `10` `!= ` `0` `)` ` ` `q.add(arr[i] * ` `10` `+ arr[i] % ` `10` `- ` `1` `);` ` ` ` ` `// Enqueue the next such number` ` ` `q.add(arr[i] * ` `10` `+ arr[i] % ` `10` `);` ` ` ` ` `// If the last digit of dequeued` ` ` `// integer is not 9, then enqueue` ` ` `// the next such number.` ` ` `if` `(arr[i] % ` `10` `!= ` `9` `)` ` ` `q.add(arr[i] * ` `10` `+ arr[i] % ` `10` `+ ` `1` `);` ` ` `}` ` ` `System.out.println(arr[N]);` `}` `// Driver Code` `public` `static` `void` `main(String[] args)` `{` ` ` `int` `N = ` `21` `;` ` ` ` ` `findNthNumber(N);` `}` `}` `// This code is contributed by Amit Katiyar` |

## Python3

`# Python 3 Program to find Nth number with` `# absolute difference between all` `# adjacent digits at most 1.` `# Return Nth number with` `# absolute difference between all` `# adjacent digits at most 1.` `def` `findNthNumber(N):` ` ` ` ` `# To store all such numbers` ` ` `arr ` `=` `[` `0` `for` `i ` `in` `range` `(N ` `+` `1` `)]` ` ` ` ` `q ` `=` `[]` ` ` `# Enqueue all integers from 1 to 9` ` ` `# in increasing order.` ` ` `for` `i ` `in` `range` `(` `1` `, ` `10` `, ` `1` `):` ` ` `q.append(i)` ` ` `# Perform the operation N times so that` ` ` `# we can get all such N numbers.` ` ` `for` `i ` `in` `range` `(` `1` `, N` `+` `1` `, ` `1` `):` ` ` ` ` `# Store the front element of queue,` ` ` `# in array and pop it from queue.` ` ` `arr[i] ` `=` `q[` `0` `]` ` ` `q.remove(q[` `0` `])` ` ` `# If the last digit of dequeued integer is` ` ` `# not 0, then enqueue the next such number.` ` ` `if` `(arr[i] ` `%` `10` `!` `=` `0` `):` ` ` `q.append(arr[i] ` `*` `10` `+` `arr[i] ` `%` `10` `-` `1` `)` ` ` `# Enqueue the next such number` ` ` `q.append(arr[i] ` `*` `10` `+` `arr[i] ` `%` `10` `)` ` ` `# If the last digit of dequeued integer is` ` ` `# not 9, then enqueue the next such number.` ` ` `if` `(arr[i] ` `%` `10` `!` `=` `9` `):` ` ` `q.append(arr[i] ` `*` `10` `+` `arr[i] ` `%` `10` `+` `1` `)` ` ` ` ` `print` `(arr[N])` `# Driver Code` `if` `__name__ ` `=` `=` `'__main__'` `:` ` ` ` ` `N ` `=` `21` ` ` `findNthNumber(N)` `# This code is contributed by Samarth` |

## C#

`// C# program to find Nth number with` `// absolute difference between all` `// adjacent digits at most 1.` `using` `System;` `using` `System.Collections.Generic;` `class` `GFG{` `// Return Nth number with` `// absolute difference between all` `// adjacent digits at most 1.` `static` `void` `findNthNumber(` `int` `N)` `{` ` ` ` ` `// To store all such numbers` ` ` `int` `[]arr = ` `new` `int` `[N + 1];` ` ` ` ` `Queue<` `int` `> q = ` `new` `Queue<` `int` `>();` ` ` `// Enqueue all integers from 1 to 9` ` ` `// in increasing order.` ` ` `for` `(` `int` `i = 1; i <= 9; i++)` ` ` `q.Enqueue(i);` ` ` `// Perform the operation N times so` ` ` `// that we can get all such N numbers.` ` ` `for` `(` `int` `i = 1; i <= N; i++)` ` ` `{` ` ` ` ` `// Store the front element of queue,` ` ` `// in array and pop it from queue.` ` ` `arr[i] = q.Peek();` ` ` `q.Dequeue();` ` ` ` ` `// If the last digit of dequeued` ` ` `// integer is not 0, then enqueue` ` ` `// the next such number.` ` ` `if` `(arr[i] % 10 != 0)` ` ` `q.Enqueue(arr[i] * 10 +` ` ` `arr[i] % 10 - 1);` ` ` ` ` `// Enqueue the next such number` ` ` `q.Enqueue(arr[i] * 10 + arr[i] % 10);` ` ` ` ` `// If the last digit of dequeued` ` ` `// integer is not 9, then enqueue` ` ` `// the next such number.` ` ` `if` `(arr[i] % 10 != 9)` ` ` `q.Enqueue(arr[i] * 10 +` ` ` `arr[i] % 10 + 1);` ` ` `}` ` ` `Console.WriteLine(arr[N]);` `}` `// Driver Code` `public` `static` `void` `Main(String[] args)` `{` ` ` `int` `N = 21;` ` ` ` ` `findNthNumber(N);` `}` `}` `// This code is contributed by Rohit_ranjan` |

**Output:**

45