PAT Grade A 1067 Sortieren mit Swap (0, i) (25 Punkte) | C ++ - Implementierung

1. Titelbeschreibung

Ursprünglicher Titellink
Fügen Sie hier eine Bildbeschreibung ein

Eingabespezifikation:

Fügen Sie hier eine Bildbeschreibung ein

Ausgabespezifikation:

Drucken Sie für jeden Fall einfach in einer Zeile die Mindestanzahl von Swaps aus, die zum Sortieren der angegebenen Permutation erforderlich sind.

Beispieleingabe:

10
3 5 7 2 6 4 9 0 8 1

Beispielausgabe:

9

Zwei Ideen zur Problemlösung

Entsprechend dem Titel müssen wir eine Sortierung durchführen, indem wir die Positionen von 0 und anderen Zahlen ständig ändern. Wie der Titel schon sagt, sind die eingegebenen Zahlen {0, 1, ..., N - 1} \ {0,1, ..., N-1 \}{ 0 ,1 ,. . . ,N.- -1 } Diese Sequenzvariante ist nicht schwer zu erkennen, dass die hier erwähnte Sortierung tatsächlich darin besteht, jede Zahl im entsprechenden Index des Arrays zu speichern. Wir können ein Array pos verwenden, um die Position darzustellen, die jeder Zahl entspricht. Wenn die Position 0 nicht 0 ist, tauschen wir immer die erste Zahl mit 0 aus und zählen gleichzeitig ++, wenn 0 an die erste Position übertragen wurde Mal sehen, ob es Zahlen gibt, die nicht an der richtigen Stelle "stehen". Wenn ja, tauschen Sie sie einmal aus und treten Sie erneut in die Schleife ein. Wenn sie alle an ihrer Stelle sind, geben Sie einfach die Anzahl aus.

Drei, AC-Code

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    
    
    int n;
    scanf("%d", &n);
    vector<int> pos(n);
    for (int i=0; i<n; i++) //初始化pos数组,表示每个数字对应的位置
    {
    
    
        int temp;
        scanf("%d", &temp);
        pos[temp] = i;
    }
    int count = 0;  //进行了几次交换
    int checkPos = 1;   //已经就位的数字个数
    bool sorted = false;    //标记是否已经排序完成
    while (!sorted) //swap(0, i)
    {
    
    
        if (pos[0] != 0)
        {
    
    
            int i = pos[0]; //暂存0的位置
            pos[0] = pos[i];    //将0交换过去
            pos[i] = i; //将i移到一开始0的位置
            count++;
            continue;
        }
        //检查是否仍存在错位
        while (checkPos<n && pos[checkPos]==checkPos)   checkPos++;
        if (checkPos==n)    sorted = true;  //n个元素全都在正确的位置
        else    //否则要用0再去和不在正确位置的数字交换
        {
    
      
            //swap(0, i)
            pos[0] = pos[checkPos];
            pos[checkPos] = 0;
            count++;
        }
    }
    printf("%d\n", count);
    return 0;
}

Ich denke du magst

Origin blog.csdn.net/weixin_42393947/article/details/108705021
Empfohlen
Rangfolge