题解:P12176 [蓝桥杯 2025 省 Python B] 书架还原

· · 题解

#include <iostream>
#include <vector>
using namespace std;

int minSwaps(vector<int>& books) {
    int n = books.size();
    vector<bool> visited(n, false);
    int swaps = 0;

    for (int i = 0; i < n; ++i) {
        if (!visited[i] && books[i] != i + 1) {
            int cycle_size = 0;
            int j = i;
            while (!visited[j]) {
                visited[j] = true;
                j = books[j] - 1;
                cycle_size++;
            }
            if (cycle_size > 0) {
                swaps += (cycle_size - 1);
            }
        }
    }
    return swaps;
}

int main() {
    int n;
    cin >> n;
    vector<int> books(n);
    for (int i = 0; i < n; ++i) {
        cin >> books[i];
    }
    cout << minSwaps(books) << endl;
    return 0;
}

代码解释

‌输入处理‌:

读取书的数量 n 和当前排列顺序 books

‌标记数组‌:

#### ‌环检测‌: 遍历数组,对于每个未被访问且不在正确位置的元素,追踪其所在的环。环的大小决定了需要交换的次数。 #### ‌交换次数计算‌: 每个环需要 环长度 $ - 1$ 次交换,累加所有环的交换次数得到最终结果 $‌68$ 。 这种方法高效且直观,确保以最少的交换次数恢复书的正确顺序。 ### _~~ so easy~ ~_