ข้อความโจทย์
กำหนดจำนวน N โดยไม่มีศูนย์นำหน้า (Leading Zeros) งานคือหาจำนวนการเคลื่อนที่ขั้นต่ำที่จำเป็นเพื่อทำให้ N หาร 25 ลงตัว ในแต่ละการเคลื่อนที่ สามารถสลับเลขสองตัวที่อยู่ติดกันได้ และต้องแน่ใจว่าในทุกเวลา ตัวเลขต้องไม่มีศูนย์นำหน้า ถ้าไม่สามารถทำให้ N หาร 25 ลงตัวได้ ให้พิมพ์ -1
ถ้า N = 5071 แล้วต้องการ 4 การเคลื่อนที่เพื่อทำให้มันหาร 25 ลงตัว
5071 → 5701 → 7501 → 7510 → 7150
อัลกอริทึม
1. วนลูปผ่านคู่ของตัวเลขทั้งหมดในจำนวน ให้ตัวแรกในคู่อยู่ตำแหน่ง 'i' และตัวที่สองอยู่ตำแหน่ง 'j' 2. วางตัวเลขเหล่านี้ไปที่ตำแหน่งสองตำแหน่งสุดท้ายของจำนวน 3. ถ้าจำนวนมีศูนย์นำหน้า หาตัวเลขที่ไม่ใช่ศูนย์ซ้ายสุดและย้ายไปตำแหน่งแรก 4. ถ้าจำนวนปัจจุบันหาร 25 ลงตัว อัปเดตคำตอบด้วยจำนวนการสลับ
ตัวอย่างโค้ด
#include <iostream>
#include <algorithm>
#include <string>
#include <climits>
using namespace std;
int requiredMoves(long long n) {
string str = to_string(n);
int ans = INT_MAX;
int len = str.size();
for (int i = 0; i < len; ++i) {
for (int j = 0; j < len; ++j) {
if (i == j)
continue;
string temp = str;
int cnt = 0;
for (int k = i; k < len - 1; ++k) {
swap(temp[k], temp[k + 1]);
++cnt;
}
for (int k = j - (j > i); k < len - 2; ++k) {
swap(temp[k], temp[k + 1]);
++cnt;
}
int pos = -1;
for (int k = 0; k < len; ++k) {
if (temp[k] != '0') {
pos = k;
break;
}
}
for (int k = pos; k > 0; --k) {
swap(temp[k], temp[k - 1]);
++cnt;
}
long long num = atoll(temp.c_str());
if (num % 25 == 0)
ans = min(ans, cnt);
}
}
if (ans == INT_MAX)
return -1;
return ans;
}
int main() {
int n = 5071;
cout << "Minimum required moves: " << requiredMoves(n) << endl;
return 0;
}
ผลลัพธ์
เมื่อคอมไพล์และรันโปรแกรมด้านบน จะได้ผลลัพธ์ดังนี้ -
Minimum required moves: 4