考虑长度为P
的排列n
。
让我们在P
上定义一个操作,如下所示:
P[i]=P[P[i]]; for every i from 1 to n
例如:
P[n] = {2, 3, 1};
1次操作后
P[1] becomes P[P[1]] = P[2]= 3;
P[2] becomes P[P[2]] = P[3]= 1;
P[3] becomes P[P[3]] = P[1]= 2;
因此,P
变成[3,1,2];
您需要找到要执行的最小操作数,之后P变为身份置换。
如果不可能,则输出-1。
输入1:
P = [2 , 1];
输出1:
1
因为它将仅在1次操作后变为身份置换。
输入2:
P = [2 , 3 , 1];
输出2:
-1
由于给定的操作无法进行身份置换。
我尝试按照以下方式解决此代码,但是我没有找到解决问题的正确方法。
Java:
import java.util.Scanner;
public class Permutation {
public static void main(String args[]) throws Exception {
Scanner s = new Scanner(System. in );
System.out.println("Enter the number of Test Cases");
int t = s.nextInt();
for (int i = 0; i < t; i++) {
System.out.println("Enter the number n");
int n = s.nextInt();
int[] arr = new int[n + 1];
for (i = 1; i <= n; i++) {
arr[i] = s.nextInt();
}
int count = 0;
int[] arr1 = new int[n + 1];``
arr1 = arr;
do {
for (i = 1; i <= n; i++) {
arr1[i] = arr1[arr1[i]];
}
count++;
}
while ( arr != arr1 );
System.out.println(count);
}
}
}
答案 0 :(得分:0)
在这段代码中,我循环直到n!尝试或何时找到排列。如果check为true,则找到并可以写入计数,如果count达到n!这意味着所有置换都完成了,我找不到身份置换,我写了-1。循环边界就是这样。让我们看一下算法。
我将原始数组复制到另一个数组中,不会丢失任何信息。每次迭代后,更改数组时,我也会保留它。
在arr1[i] = arr[arr[i]];
之后,我对arr1进行了排序,并检查排序的arr1是否等于先前的arr1,如果它们相等,则我找到了排列,打破了循环,使布尔值true并打印结果,否则迭代一个更多时间。
import java.util.Arrays;
import java.util.Scanner;
public class Permutation {
public static void main(String args[] ) throws Exception {
Scanner s = new Scanner(System.in);
System.out.println("Enter the number of Test Cases");
int t = s.nextInt();
for(int i=0;i<t;i++)
{
System.out.println("Enter the number n");
int n = s.nextInt();
int[] arr=new int[n+1];
for(i=1;i<=n;i++){
arr[i]=s.nextInt();
}
int count=0;
int[] arr1=new int[n+1];
arr1 = Arrays.copyOf(arr, arr.length);
boolean check;
do {
for (i = 1; i <= n; i++) {
arr1[i] = arr[arr[i]];
}
arr = Arrays.copyOf(arr1, arr1.length);
count++;
int [] temp = Arrays.copyOf(arr1, arr1.length);
Arrays.sort(arr1);
check = false;
for(int m =1;m<=n;m++){
if(arr1[m]==temp[m])
check = true;
else{
check = false;
break;
}
}
}
while(count<fact(n) && check!=true);
if(count == fact(n))
System.out.println("-1");
else
System.out.println(count);
}
}
public static int fact(int n){
int temp = 1;
for(int i=1;i<=n;i++)
temp*=i;
return temp;
}
}