T440245 守序数

守序数

题目描述

如果一个十进制正整数的任意两个相邻的数字之差均不超过 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 1n100
  • 60% 的数据, 1 ≤ n ≤ 10000 1≤n≤10000 1n10000
  • 100% 的数据, 1 ≤ n ≤ 1 , 000 , 000 1≤n≤1,000,000 1n1,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;
}
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值