守序数
题目描述
如果一个十进制正整数的任意两个相邻的数字之差均不超过 1,则称该数字为守序数。
1 是第一个守序数,给定 n 请求出第 n 个守序数。
输入格式
- 单个整数表示 n
输出格式
- 单个整数表示答案
样例 #1
样例输入 #1
13
样例输出 #1
21
提示
前13个守序数是 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 21 1,2,3,4,5,6,7,8,9,10,11,12,21 1,2,3,4,5,6,7,8,9,10,11,12,21,所以输出21。
数据范围
- 30% 的数据, 1 ≤ n ≤ 100 1≤n≤100 1≤n≤100
- 60% 的数据, 1 ≤ n ≤ 10000 1≤n≤10000 1≤n≤10000
- 100% 的数据, 1 ≤ n ≤ 1 , 000 , 000 1≤n≤1,000,000 1≤n≤1,000,000
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
long long a[N];
long long n, x, y, t, p = 9;
queue<long long> q;
int main() {
cin >> n;
for (int i = 1; i <= 9; i++) {//先 9 个一位数进队列
a[i] = i;
q.push(i);
}
while (!q.empty()) {
x = q.front();
q.pop();
y = x % 10;
for (int t = 1; t <= 3; t++) {
if (t == 1 && y != 0) {//-1
a[++p] = x * 10 + y - 1;
q.push(a[p]);
}
if (t == 2) {//不变
a[++p] = x * 10 + y;
q.push(a[p]);
}
if (t == 3 && y != 9) {//+1
a[++p] = x * 10 + y + 1;
q.push(a[p]);
}
if (p == n) {//达到目标
cout << a[n] << endl;
return 0;
}
}
}
return 0;
}