java:P1706 全排列问题

洛谷题目: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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值