第四题:T4守序数
标签:广度优先搜索
题意:如果一个十进制正整数的任意两个相邻的数字之差均不超过
1
1
1,则称该数字为守序数。
1
1
1是第一个守序数,给定
n
n
n请求出第
n
n
n个守序数。(
1
<
=
n
<
=
1
0
6
1<=n<=10^6
1<=n<=106)
题解:观察一下前几个,
1
、
2
、
3...9
、
10
、
11
、
12
1、2、3...9、10、11、12
1、2、3...9、10、11、12,发现其实后一位数字是前一位数字的
−
1
、
+
0
、
+
1
-1、+0、+1
−1、+0、+1情况,然后又想让一位数跑完之后再跑两位数,那其实就是一个
b
f
s
bfs
bfs扩散的逻辑,第一位数为了避免
0
0
0的情况,我们直接先塞
1
、
2
、
3...9
1、2、3...9
1、2、3...9到队列中,然后不断跑,跑到存储到数组中的数有
n
n
n个为止。最后要输出第
n
n
n个,我们排个序输出即可。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, c = 0, a[1000005];
struct node {
// pre:上一个选的数 val:目前得到的值
ll pre, val;
}p, u;
int main() {
queue<node> q;
cin >> n;
for (ll i = 1; i <= 9; i++) {
p.pre = i; p.val = i;
q.push(p);
}
while (c <= n) {
p = q.front();
q.pop();
a[++c] = p.val;
for (ll i = -1; i <= 1; i++) {
u.pre = p.pre + i;
u.val = p.val * 10 + u.pre;
if (u.pre >= 0 && u.pre <= 9) q.push(u);
}
}
sort(a + 1, a + 1 + c);
cout << a[n];
return 0;
}