J'ai une permutation d'une séquence de nombres naturels incrémentés à partir de 1 dans un tableau. Comment puis-je déterminer si le tableau peut être trié en utilisant la rotation de 3 éléments consécutifs ?
J'ai implémenté un algorithme dans lequel je compare les indices du tableau avec l'élément à cet indice dans le tableau. S'ils ne sont pas égaux, j'appelle la fonction choose_indices() qui trouve d'abord l'élément à échanger à la bonne position dans le tableau et après l'avoir trouvé, sélectionne les 3 éléments consécutifs incluant le numéro à échanger et les fait tourner. Après avoir effectué n-1 rotations pour un tableau de taille n, le tableau est trié. Cette implémentation renvoie vrai si un tableau peut être trié en utilisant la rotation de 3 éléments consécutifs, mais demande un délai d'attente pour un tableau si le tableau ne peut pas être trié en utilisant cette méthode.
using namespace std;
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
int n;
void rotate(vector<int> &arr,int end,int mid,int start)
{
int temp=arr[start];
arr[start]=arr[end];
arr[end]=arr[mid];
arr[mid]=temp;
}
void choose_indices(vector<int> &arr,int s,int q)
{
for(int l=q;l<n;l++)
{
if(arr[l]==s)
{
if(l-q>=2)
{
rotate(arr,l,l-1,l-2);
break;
}
else
{
rotate(arr,l+1,l,l-1);
break;
}
}
}
}
int main()
{
vector<int> arr;
int q,count=0;
cin>>q;
for(int i=0;i<q;i++)
{
cin>>n;
count=0;
for(int i=0,p;i<n;i++)
{
cin>>p;
arr.push_back(p);
}
for(int j=0,k=1;j<n && k<n; )
{
if(arr[j]!=k)
{
choose_indices(arr,k,j);
if(arr[j]==k)
{
j++;
k++;
count++;
}
}
else
{
j++;
k++;
count++;
}
}
if(count==n-1)
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
arr.clear();
}
}
Entrée de l'échantillon : 1 2 3 5 4
Pour cette entrée, mon code donne une erreur d'exécution. Comment puis-je savoir si le tableau donné ne peut pas être trié en utilisant la rotation de 3 éléments consécutifs ?