目录
1.煤球数目
代码:
/**
* 煤球数目
* 规律:
* 1
* 1+2
* 1+2+3
* 1+2+3+4
* ...
*
* @param args
*/
public static void main(String[] args) {
int sum = 0;
int total = 0;
for(int i = 1; i <= 100; i++) {
//统计每一层的数量
sum += i;
//统计总共 100 层的数量
total += sum;
}
System.out.println(total);
}
结果: 171700
2.生日蜡烛
代码:
/**
* 生日蜡烛
* @param args
*/
public static void main(String[] args) {
// 从 0 岁开始尝试,假设最大是从 100岁开始吹蜡烛的
for(int i = 0; i <= 100; i++) {
int total = 0; //统计总共吹的蜡烛
//总数小于 236 时,继续往后 统计
for(int j = i; total < 236; j++) {
total += j;
}
//判断 total 是不是刚刚好 是 236
if(total == 236) {
//答案就是它
System.out.println("answer:::"+i);
break;
}
}
}
结果: 26
3. 分小组
代码:
/**
* 这个方法 用来确定 第三组 的三个成员
* @param a
* @return
*/
public static String remain(int[] a)
{
String s = "";
for(int i=0; i<a.length; i++){
if(a[i] == 0) s += (char)(i+'A');
}
return s; //返回一个字符串
}
public static void f(String s, int[] a)
{
//第一个for 确定 第二组 第一个人
for(int i=0; i<a.length; i++){
if(a[i]==1) continue; //检查是否重复
a[i] = 1;
//第二个for 确定 第二组 第二个人
for(int j=i+1; j<a.length; j++){
if(a[j]==1) continue; //同上
a[j]=1;
//第三个for 确定 第二组 第三个人
for(int k=j+1; k<a.length; k++){
if(a[k]==1) continue;
a[k]=1;
//将各个成员打印出来
System.out.println(s+" "+(char)('A'+i)+(char)('A'+j)+(char)('A'+k)+" "+remain(a)); //填空位置
a[k]=0; //状态清零,好下一次又可以派他
}
a[j]=0; //同上
}
a[i] = 0; //同上
}
}
public static void main(String[] args)
{
int[] a = new int[9];
a[0] = 1; //确定的第一组的第一个成员
for(int b=1; b<a.length; b++){
a[b] = 1; //这层循环 确定了 第一组 的第二个成员
for(int c=b+1; c<a.length; c++){
a[c] = 1; //这层确定第一组第三个成员
//将这三个成员处理成一个字符串
String s = "A" + (char)(b+'A') + (char)(c+'A');
f(s,a); //递归找后面的成员
a[c] = 0; //这里进行回溯
}
a[b] = 0;
}
}
答案 : s+" "+(char)('A'+i)+(char)('A'+j)+(char)('A'+k)+" "+remain(a)
4.抽签
代码:
/**
* dfs
* @param a 存放国家和每个国家派出最大人数的信息
* @param k 存放当前拜访到第几个国家了
* @param n 当前观察团还有几个人数空位
* @param s 存放每组观察团的人员
*/
public static void f(int[] a, int k, int n, String s)
{
//递归结束条件 : 每个国家都问过
if(k==a.length){
//考察团人数已满,打印这一组的人员
if(n==0) System.out.println(s);
return;
}
String s2 = s; //将当前已确定的人员存放到 s2 中
for(int i=0; i<=a[k]; i++){
f(a,k+1,n-i,s2); //填空位置
s2 += (char)(k+'A');
}
}
public static void main(String[] args)
{
//有六个国家,对应数组的个数.
//数组的内容对应每个国家所能 派出的最大人数
int[] a = {4,2,2,1,1,3};
//传5是因为 观察团 的组成人数 最多为 5 个
f(a,0,5,"");
}
答案 : f(a,k+1,n-i,s2)