1. Descrição do título
Especificação de entrada:
Especificação de saída:
Para cada caso, basta imprimir em uma linha o número mínimo de trocas necessárias para classificar a permutação fornecida.
Amostra de entrada:
10
3 5 7 2 6 4 9 0 8 1
Saída de amostra:
9
Dois, ideias para solução de problemas
De acordo com o título, temos que realizar uma classificação mudando constantemente as posições de 0 e outros números. Conforme o título foi informado, os números inseridos são {0, 1, ..., N - 1} \ {0,1, ..., N-1 \}{ 0 ,1 ,. . . ,N-1 } Esta variante de sequência não é difícil de ver que a classificação mencionada aqui é, na verdade, armazenar cada número no subscrito correspondente da matriz. Podemos usar um array pos para representar a posição correspondente a cada número. Quando a posição de 0 não é 0, sempre trocamos o primeiro número por 0, e ao mesmo tempo contamos ++, se 0 foi transferido para a primeira posição , Vamos ver se há alguns números que não "estão" no lugar certo. Se houver, troque-os uma vez e entre novamente no loop; se eles estiverem todos em seus lugares, apenas conte a saída.
Três, código 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;
}