ภาพรวมปัญหา
ได้รับตัวเลข n ต้องพิมพ์ Jumping Numbers ทั้งหมด ≤ n
Jumping Numbers คืออะไร?
ตัวเลขที่หลักติดกันต่างกัน 1 เท่านั้น เช่น 4565, 98, 7
ตัวเลข 1 หลักทั้งหมดเป็น Jumping Numbers
235 ไม่ใช่ เพราะ 3 และ 5 ต่างกัน 2
ตัวอย่าง
Input: N = 32 Output: 0 1 2 3 4 5 6 7 8 9 10 12 21 23 32
วิธีแก้ปัญหา (BFS บน Graph)
สมมติกราฟที่ 0 เป็นโหนดเริ่มต้น สร้างโหนดถัดไปโดยเพิ่มหลักสุดท้าย ±1 (ยกเว้น 0 และ 9) ใช้ BFS/DFS ไปเยี่ยมโหนดที่ ≤ N
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
void traverse(int N, int num) {
queue<int> q;
q.push(num);
while (!q.empty()) {
num = q.front(); q.pop();
if (num <= N) {
cout << num << " ";
int last_dig = num % 10;
if (last_dig == 0)
q.push((num * 10) + (last_dig + 1));
else if (last_dig == 9)
q.push((num * 10) + (last_dig - 1));
else {
q.push((num * 10) + (last_dig - 1));
q.push((num * 10) + (last_dig + 1));
}
}
}
}
void printJumpingNumber(int N) {
cout << 0 << " ";
for (int i = 1; i <= 9 && i <= N; i++)
traverse(N, i);
}
int main() {
int N = 54;
cout << "Jumping Numbers less than " << N << " are:\n";
printJumpingNumber(N);
return 0;
}
ผลลัพธ์ (Output)
Jumping Numbers less than 54 are: 0 1 10 12 2 21 23 3 32 34 4 43 45 5 54 6 7 8 9