B3689 [语言月赛202212] 宇宙密码 题解
B3689 [语言月赛202212] 宇宙密码 题解
Source & Knowledge
2022 年 12 月语言月赛,由洛谷网校入门计划/基础计划提供。
文字题解
题目大意
给定整数
某一位发生「变化」,指这一位的数字
解析
提供一种比较简单的做法。
我们注意到数字至多只可能有
所以,我们可以逐个枚举
下面介绍一下判断流程。
我们不妨设当前枚举到的整数是
比较分为以下情况:
- 如果
x 的当前位与a 的对应位相同,则不做处理。 - 如果
x 的当前位与a 的对应位的差值的绝对值为1 或9 ,则上述的变量c 增加1 。 - 如果
x 的当前位与a 的对应位的差值绝对值\geq 2 且\neq 9 ,则直接判断x 不符合要求。
如果在上述的枚举过程中没有出现「直接判断为不符合要求」的情况,则将
以下是判断流程的代码,使用 check 函数实现:
int check(int x) {
int cnt = 0, var = a;
for (int i = 1; i <= n; ++i) {
if (abs((var % 10) - (x % 10)) == 1 || abs((var % 10) - (x % 10)) == 9) {
++cnt;
} else if (abs((var % 10) - (x % 10)) >= 2) {
return 0;
}
var /= 10, x /= 10;
}
return cnt <= k;
}
枚举
cin >> n >> a >> k;
int limit = pow(10, n);
for (int i = 0; i < limit; ++i) {
if (check(i)) {
cout << i << endl;
}
}
return 0;
由于枚举顺序,自然而然我们保证了从小到大输出。
可以看到,整体的代码量是较小的。
视频题解
完整代码请在视频中查看。