洛谷题目:P1706 全排列问题
题目描述: 思路提供: 我的代码:package 算法竞赛; import java.io.*; public class Interface1{ // 静态的成员变量看作是全局变量理解就好了 static int k = 1; // 用来记录已经选取的数字有几个 static int n = 0; // 接收数据,因为是递归中都需要使用,所以设置为全局变量,也即java中的静态成员变量 static boolean[] pd = new boolean[12]; // 该数组用来判断下标数字是否被征用,所以最好用boolean【】数组 static int[] cc = new int[12]; // 该数组用来存储一组符合题意的数据 static StringBuilder stringBuffer = new StringBuilder(); static BufferedReader ins = new BufferedReader(new InputStreamReader(System.in)); static StreamTokenizer in = new StreamTokenizer(ins); static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); public static void main(String[] args) throws IOException{ in.nextToken(); n = (int)in.nval; dfs(1); out.println(stringBuffer); // 输出数据 out.close(); } // 这种方法真是妙啊,以后要多用递归啊 public static void dfs(int t){ if(t>n) { out(n); // 记录输出数据 } else // t<=n 说明t还在找第t位没有被征用的数字 { for(int i = 1;i<=n;i++) // 遍历找未被征用的数字 { if(pd[i] == false) // 如果i未被征用,if语句可以简化为 if(!pd【i】) { pd[i]=true; // 征用 cc[k]=i; // 记录征用的数字 k++; // k++是为了方便存储下一位数字 dfs(t+1); // 找下一位未被征用的数字 pd[i]=false; // 能走到这说明,执行完了dfs()也即,遇见了if语句,找到了完整的一组数据 } // 所以此时当前数据就没有征用的必要了,释放当前征用的数据 } } k--; // 走到这里说明该函数要出栈了,也即该函数结束,所以k--是为了,抵消上一个函数 } // 的k++,使k指向此时的cc数组存储的数据的末尾,准备修改末尾这个数据,自己 // 模拟下接下来的情况就好了。 public static void out(int n){ // 记录应该输出的数据 for(int i = 1;i<=n;i++) { stringBuffer.append(" ").append(cc[i]); } stringBuffer.append("n"); } }
dfs的算法思想,征用与释放
如有谬误,请务必告知,以免误导他人
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)