java:P1157 组合的输出

洛谷题目:P1157 组合的输出

题目如下:

我的代码:

import java.io.*;
/*
思路:dfs思想,其中改进下即可,这样就能够得到不重复的组合。
递归代码提醒:t代表当前函数找第几个数,l接收上一个函数的i+1,从而实现不重复组合。
 */
public class Main{
    
    
    static int k = 0;               // 接收几个数据
    static int ct = 0;              // 指向cc【】的存储数据的下一个位置
    static int[] ints;              // 存入输入数据
    static boolean[] pd;            // 判断读入的数据某些是否被使用
    static int[] cc;                // 存入应该输出的数据
    static StringBuilder str = 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();
        int n = (int)in.nval;
        in.nextToken();
        k = (int)in.nval;
        ints = new int[n];
        pd = new boolean[n];
        cc = new int[k];
        for(int i = 0;i<ints.length;i++)			// 他不给数据,那就自己填呗。
        {
    
    
            ints[i] = i+1;
        }
        dfs(1,0);
        out.print(str);
        out.close();
    }

    public static void dfs(int t,int l){
    
    
        if(t > k)
        {
    
                                               // 到这里说明已经找到符合条件的数据了
            int sum = 0;                            // 所以求和判断是否为质数即可
            for(int i = 0;i<cc.length;i++)
            {
    
    
//                str.append(String.format("%3d",cc[i]));			// 用这玩意既费时间又费空间!能不要用就不要用!!!
                if(cc[i]>=10)
                {
    
    
                    str.append(" "+cc[i]);
                }
                else
                {
    
    
                    str.append("  "+cc[i]);
                }
            }
            str.append("\n");
        }
        else
        {
    
    
            for(int i = l;i<ints.length;i++)
            {
    
    
                if(!pd[i])
                {
    
    
                    pd[i] = true;
                    cc[ct] = ints[i];
                    ct++;
                    dfs(t+1,i+1);               // i+1,即可实现不重复,让下一个函数从接收到的i+1开始循环征用。
                    pd[i] = false;
                }
            }
        }
        ct--;									// 本方法结束时,即要弹栈回到上一个方法,所以ct接收的对应的位置自然相应--
    }
}

总结:

这三个题也太像了吧?就是dfs的问题。
java:P1706 全排列问题
java:P1036 [NOIP2002 普及组] 选数

String.format()方法实在是太浪费时间了,也太浪费空间了!能不用千万别用!

用了String.format()
在这里插入图片描述

不用String.format(),改为if判断填空格。
在这里插入图片描述
这效率直接起飞!
反正跟String沾边的最好都别碰!

如有谬误,请务必告知,以免误导他人

猜你喜欢

转载自blog.csdn.net/weixin_51304266/article/details/121409134
今日推荐