蓝桥杯
七段码的问题描述
正确答案是80
第一个要讲的问题是求一个子集的个数
/**
* 求一个集合(元素唯一)的子串的个数
*
* @author 楠
*
*/
public class Test02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
char[] arr = {
'a', 'b', 'c' };
int dfs = dfs(arr);
System.out.println(dfs);
}
/**
*
* @param arr 集合
* @param isVisited 用于判断集合内元素是否被访问过
* @param i 从集合中哪个元素开始获取子集
* @param j 子集内元素的个数
* @return 返回从i元素为第一个元素的子集,子集元素为j个的集合的个数
* 也可以发现对于集合来说有没有boolean[] isVisited这个数组是不影响结果的,但是对于图来说就是不一样的
*/
public static int dfs(char[] arr, boolean[] isVisited, int i, int j) {
int count = 0;
if (j == 1) {
return 1;
}
isVisited[i] = true;
for (int m = i + 1; m < arr.length; m++) {
if (!isVisited[m]) {
count = count + dfs(arr, isVisited, m, j - 1);
}
}
isVisited[i] = false;
return count;
}
/**
*
* @param arr集合
* @return 返回集合非空子串的个数
*/
public static int dfs(char[] arr) {
boolean[] isVisited = new boolean[arr.length];
int count = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 1; j <= arr.length; j++) {
count = count + dfs(arr, isVisited, i, j);
}
}
return count;
}
}
七段码
解题思路
- 将边抽象成点,构造图
- 对点进行编号
- 获取点的组合
- 对每一个组合进行判断,是否连通,连通就是一种情况
- 返回和 的 值
import java.util.ArrayList;
import java.util.List;
public class Demo04 {
public static void main(String[] args