import java.util.*;


public class Solution {
    //全局变量:
     ArrayList<ArrayList<Integer>> ret;
     ArrayList<Integer> path ; //记录走过的路径
     boolean[] check ;//检查该数子是否被选过。避免11的情况
   
    public ArrayList<ArrayList<Integer>> permute (int[] num) {
        ret = new ArrayList<ArrayList<Integer>>();
        path = new ArrayList<Integer>();
        check = new boolean[num.length];
        dfc(num);
        return ret;
    }
    //递归求解
    public void dfc(int[] num){
        //终止条件:全部遍历
        if(num.length==path.size()){
		  //加入时需要new,不能直接加入,类中只是声明
            ret.add(new ArrayList<>(path));
            return;
        }

        //遍历数组进行决策
        for(int i=0;i<num.length;i++){
            //没走过时进行
            if(check[i]==false){
                //加入路径,修改check
                path.add(num[i]);
                check[i] = true;
                //进行下一层决策
                dfc(num);
                //到最后一个节点回溯
                //将当前节点设为未走过
                check[i] = false;
                //移除走的路径最后一个节点
                path.remove(path.size()-1);

            }
        }
    }
}