递归,全排列
!! 90分 90分 ! 输入2 数据10000个超时,目前还不知道怎么弄
java.lang.StackOverflowError
:数据为10000个的时候,报错。
思路:使用全排列的递归,根据递归的次数来判断是否达到了数学家给的数,达到的话,把flagx标记为1,一直return即可。
import java.util.Scanner;
class test{
static int n;
static int[] a ;
static int num;
static int flag = 0;
static int flagx = 0;
static int[] nums;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
a = new int[n+1];
num = sc.nextInt();
nums = new int[n+1];
for (int i = 1 ; i <= n ; i++)
{
nums[i] = sc.nextInt();
}
dfs(1);
}
public static void dfs(int step){
if (flagx == 1){
return;
}
if (step > n){
flag++;
if (flag > num)
{
for (int i = 1 ; i <= n ; i++)
{
System.out.print(nums[i]+" ");
}
System.out.println();
flagx = 1; //找到符合条件的,给flagx赋值为1,return。
}
return;
}
for (int i = 1 ; i <= n ; i++)
{
if(flag == 0)
{
//这一步,在全排列中第i个数就是i,但是这里外星人的第i个手指不一定是i。
i = nums[step];
}
if (a[i] != 1)
{
a[i] = 1; //标记
nums[step] = i; //赋值
dfs(step+1); //递归
a[i] = 0; //取消标记
}
}
}
}