洛谷题目: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沾边的最好都别碰!
如有谬误,请务必告知,以免误导他人