找到最少的操作数,之后P成为一个身份置换

时间:2019-04-02 10:54:20

标签: java

考虑长度为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);
        }
    }
}

1 个答案:

答案 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;
}

}