PAT Grado A 1067 Ordenar con Swap (0, i) (25 puntos) | Implementación de C ++

1. Descripción del título

Enlace del título original
Inserte la descripción de la imagen aquí

Especificación de entrada:

Inserte la descripción de la imagen aquí

Especificación de salida:

Para cada caso, simplemente imprima en una línea el número mínimo de intercambios necesarios para ordenar la permutación dada.

Entrada de muestra:

10
3 5 7 2 6 4 9 0 8 1

Salida de muestra:

9

Dos ideas para resolver problemas

Según el título, tenemos que realizar una ordenación cambiando constantemente las posiciones del 0 y otros números. Como se ha dicho en el título, los números ingresados ​​son {0, 1, ..., N - 1} \ {0,1, ..., N-1 \}{ 0 ,1 ,. . . ,norte-1 } Esta variante de secuencia no es difícil de ver que la clasificación mencionada aquí es en realidad para almacenar cada número en el subíndice correspondiente de la matriz. Podemos usar una matriz pos para representar la posición correspondiente a cada número. Cuando la posición de 0 no es 0, siempre intercambiamos el primer número con 0, y al mismo tiempo contamos ++, si 0 se ha transferido a la primera posición , Veamos si hay números que no "se colocan" en el lugar correcto. Si los hay, cámbielos una vez y vuelva a ingresar al bucle; si están todos en su lugar, solo emite el recuento.

Tres, código de CA

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

Supongo que te gusta

Origin blog.csdn.net/weixin_42393947/article/details/108705021
Recomendado
Clasificación