解题思路:稍加分析,根据数据规模,先对模糊的数字全排列吗,然后组成完整的数组,再判断完整的数组是否满足条件。
失误:把简单的问题想的有点复杂了。
import java.util.*;
public class Main {
public static List<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
public static List<Integer> temp=new ArrayList<Integer>();
public static void main(String args[]){
Scanner in=new Scanner(System.in);
while(in.hasNext()){
int n=in.nextInt();
int k=in.nextInt();
int num[]=new int[n+1];
int visit[]=new int[n+1];
List<Integer> list=new ArrayList<Integer>();
for(int i=1;i<=n;i++){
num[i]=in.nextInt();
visit[num[i]]=1;
}
for(int i=1;i<=n;i++){
if(visit[i]==0){
list.add(i);
}
}
res.clear();
temp.clear();
int visit2[]=new int[list.size()];
dfs(visit2,list);
int rescnt=0;
for(int i=0;i<res.size();i++){
List<Integer> temp2=res.get(i);
int cnt3=0;
int tempnum[]=new int[n+1];
for(int j=1;j<=n;j++){
if(num[j]==0){
tempnum[j]=temp2.get(cnt3++);
}else{
tempnum[j]=num[j];
}
}
if(f1(tempnum)==k)
rescnt++;
}
System.out.println(rescnt);
}
}
public static int f1(int num[]){
int cnt=0;
for(int i=1;i<num.length;i++){
for(int j=i+1;j<num.length;j++){
if(num[j]>num[i])
cnt++;
}
}
return cnt;
}
public static void dfs(int visit[],List<Integer> list){
if(temp.size()==list.size()){
res.add(new ArrayList(temp));
}else{
for(int i=0;i<list.size();i++){
if(visit[i]==0){
visit[i]=1;
temp.add(list.get(i));
dfs(visit,list);
visit[i]=0;
temp.remove(temp.size()-1);
}
}
}
}
}