PAT Grade A 1067 Trier avec Swap (0, i) (25 points) | Implémentation C ++

1. Description du titre

Lien du titre original
Insérez la description de l'image ici

Spécification d'entrée:

Insérez la description de l'image ici

Spécification de sortie:

Pour chaque cas, imprimez simplement sur une ligne le nombre minimum de swaps nécessaires pour trier la permutation donnée.

Exemple d'entrée:

10
3 5 7 2 6 4 9 0 8 1

Exemple de sortie:

9

Deux idées de résolution de problèmes

Selon le titre, nous devons effectuer un tri en changeant constamment les positions de 0 et d'autres nombres. Comme le titre a été dit, les nombres saisis sont {0, 1, ..., N - 1} \ {0,1, ..., N-1 \}{ 0 ,1 ,. . . ,N-1 } Cette variante de la séquence n'est pas difficile de voir que le tri évoqué ici consiste en fait à stocker chaque nombre dans l'indice correspondant du tableau. On peut utiliser un tableau pos pour représenter la position correspondant à chaque nombre. Quand la position de 0 n'est pas 0, on échange toujours le premier nombre avec 0, et en même temps count ++, si 0 a été transféré à la première position , Voyons s'il y a des nombres qui ne «tiennent» pas à la bonne place. S'il y en a, échangez-les une fois et relancez la boucle. S'ils sont tous à leur place, affichez simplement count.

Trois, code AC

#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;
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_42393947/article/details/108705021
conseillé
Classement