【蓝桥杯】不会用全排列,那就直接上for循环

举报
随性. 发表于 2022/04/25 16:01:19 2022/04/25
【摘要】 蓝桥杯---Java大学C组---个人赛日常刷题【day20】

🚩拿下蓝桥省赛

        这两天没有更新博客,有点事多,就没更新,今天给大家更新一下蓝桥杯全排列的题,不会可以用for循环来解。

🚗 1.饮料换购

饮料厂举办一次促销优惠活动,乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账)。请你计算一下,如果小明不浪费瓶盖,尽可能地参加活动,那么,对于他初始买入的n瓶饮料最后他一共能喝到多少瓶饮料?

输入:一个整数n,表示开始购买的饮料数量(0<n<10000)

输出:一个整数,表示实际得到的饮料数

        看到这道题不知道大家有没有想到冰红茶呢(童年回忆),这是一道往年的编程大题,还是非常简单的,根本没用到什么算法,最主要的是大家别忘记加上它最开始买的n瓶。 

import java.util.*;
 
public class Main
{
    public static void main(String args[])
    {
        Scanner sc =new Scanner(System.in);
		int n=sc.nextInt();
		int sum=n;
		int s=n;
		while(s>=3){
			sum=sum+s/3;
			s=s%3+s/3;
		}
		System.out.println(sum);
    }
}

🚓 2.牌型种数

小明被劫持到X赌城,被迫与其他3人玩牌。

一副扑克牌(去掉大小王,共52张),均匀发给4个人,每个人13张

这时,小明脑子里突然想到一个问题:

如果不考虑花色,只考虑点数,也不考虑自己得到的牌的先后顺序,自己手里能拿到的初始牌型组合一共有多少种呢?

        这种题只能去穷举暴力遍历所有情况,只能使用回溯的方法去搜索所有的方法,而且因为是不分花色,每张牌都有相同的四张,所以我们还需要去重。不会回溯的同学一定要先去学习回溯,对于蓝桥杯来说非常的重要,因为需要枚举的情况可能性太多,只能通过回溯去搜索。

import  java.util.*;
 
public class Main
{	
	static int k[]={1,2,3,4,5,6,7,8,9,10,11,12,13};
	static int count=0;
	public static void main(String args[])
	{
		
		int t[]=new int[14];    //记录每个牌已经拿了几张
		Get(0,0,t);    // 每一张可以拿0,1,2,3,4张, 
						//	第一个0代表1~13中的第一张的点数   第二个0代表拿到的总数
		System.out.println(count);
	}
	public static void Get(int q,int w,int t[])
	{
		if(w==13)    //牌数够了
		{
			count++;return;
		}
		if(q==13)return;     //已经拿了最后点数位13的牌了
		for(int i=0;i<=4;i++)
		{
			w+=i;
			t[q]=i;
			Get(q+1,w,t);//深度优先搜索
			w-=i;      //回溯法     
		}
	}
}

             其实用for循环来解题,也还是可以的,直接13个for循环, 然后判断恒等于13的时候,变量++,最后输出即可。

import java.util.*;
 
public class Main
{
    public static void main(String args[])
    {
        int count=0; //记录数据
		for (int a = 0; a <= 4; a++) {
			for (int b = 0; b <=4; b++) {
				for (int c = 0; c <=4; c++) {
					for (int d = 0; d <=4; d++) {
						for (int e = 0; e <=4; e++) {
							for (int f = 0; f <=4; f++) {
								for (int g = 0; g <=4; g++) {
									for (int h = 0; h <=4; h++) {
										for (int i = 0; i <=4; i++) {
											for (int j = 0; j <=4; j++) {
												for (int k = 0; k <=4; k++) {
													for (int l = 0; l <=4; l++) {
														for (int m = 0; m <=4; m++) {
															if (a+b+c+d+e+f+g+h+i+j+k+l+m==13) { //判断等于13的时候
																count++; //计数器++
															}
														}
													}
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		System.out.println(count); //输出计数器
    }
}

🚕3.煤球数目

有一堆煤球,堆成三角棱锥体。具体:

第一层放1个,第二层3个,第三层6个,第四层10个,.............如果一共有100层,共有多少个煤球?

        题目还是比较简单的,我们找出相加的规律即可。从第一层开始,循环到100,然后a+i,在用count+a即可。

import java.util.*;
 
public class Main
{
    public static void main(String args[])
    {
        int a=0;
		int count=0;
		for (int i =1; i <=100; i++) {
			a=a+i;
			count=count+a;
		}
		System.out.println(count);
    }
}

🛺4.生日蜡烛

某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛。

现在算起来,他一共吹熄了236根蜡烛。

请问,他从多少岁开始过生日party的?

         这道题也是比较基础的题目,我们从1开始遍历,每次往后加即可,如果能恰好加到236,说明就是这个数,如果超过236说明就不是。继续下一个数的累加,直到找到答案。

import java.util.*;
 
public class Main
{
    public static void main(String args[])
    {
        for (int i = 1; i < 99; i++) {
			int sum = 0;
			for (int j = i; j < 99; j++) {
				sum += j;
				if (sum == 236) {
					System.out.println(i);
				}
			}

		}
    }
}

🚙5.凑算式(10个for循环或全排列)

              这道题哈,其实就用for循环就可以,9个数字,9个for循环就行,在判断每个数字不相等,然后在带入公式即可。

for循环:

import java.util.*;
 
public class Main
{
    public static void main(String args[])
    {
        int sum=0;
		for (int a = 1; a <=9; a++) {
			for (int b = 1; b <=9; b++) {
				for (int c = 1; c <=9; c++) {
					for (int d = 1; d <=9; d++) {
						for (int e = 1; e <=9; e++) {
							for (int f = 1; f <=9; f++) {
								for (int g = 1; g <=9; g++) {
									for (int h =1; h <=9; h++) {
										for (int i = 1; i <=9; i++) {
											if ((a!=b&&a!=c&&a!=d&&a!=e&&a!=f&&a!=g&&a!=h&&a!=i)&&
                                                (b!=c&&b!=d&&b!=e&&b!=f&&b!=g&&b!=h&&b!=i)&&
                                                (c!=d&&c!=e&&c!=f&&c!=g&&c!=h&&c!=i)&&
                                                (d!=e&&d!=f&&d!=g&&d!=h&&d!=i)&&
                                                (e!=f&&e!=g&&e!=h&&e!=i)&&
                                                (f!=g&&f!=h&&f!=i)&&
                                                (g!=h&&g!=i)&&
                                                (h!=i)) {
												int shang=d*100+e*10+f;
												int xia=g*100+h*10+i;
												if (a+(b*1.0/c)+((shang*1.0)/xia)==10) {
													sum++;
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
		System.out.println(sum);
    }
}
全排列:(在网上找的大佬的方法)
public class 凑算式2 {
    static int[] a={1,2,3,4,5,6,7,8,9};
    static int ans;
    public static void main(String[] args) {
        f(0);
        System.out.println(ans);//输出为29
    }
    public static boolean check() {
        int x = a[3] * 100 + a[4] * 10 + a[5];
        int y = a[6] * 100 + a[7] * 10 + a[8];
        if ((a[1] * y + a[2] * x) % (y * a[2]) == 0 && a[0] + (a[1] * y + a[2] * x) / (y * a[2]) == 10) {
            return true ;
        }
        return false;
    }
        public static void f (int k){//全排列方法
            if (k == 9) {
                if (check()){
                    ans++;
                }
            }
            //从k往后的每个数字都可以放在k位
            for (int i = k; i < 9; i++) {
                exch(a,i,k);
                f(k+1);
                exch(a,i,k);
            }
        }
        public static void exch(int[] a,int x,int y){
            int c=a[x];
            a[x]=a[y];
            a[y]=c;
        }
    }

🚌6.纸牌三角形(全排列或9个for循环枚举)    

      这道题目,又是典型的全排列问题,比较容易让人出错的地方就是一种情况经过旋转和镜像会产生多少种?答案是六种,如图这样的情况,经过镜像会产生另外一种,旋转以后可以得到两种,旋转再镜像又可以得到两种,加一起就是六种。所以我们直接算出的答案去重的话需要除以六才是标准的答案。

for循环:

import java.util.*;
 
public class Main
{
    public static void main(String args[])
    {
        int sum=0;
		for (int a = 1; a <=9; a++) { //1
			for (int b = 1; b <=9; b++) { //2
				for (int c = 1; c <=9; c++) { //3 
					for (int d = 1; d <=9; d++) { //4 
						for (int e =1; e <=9; e++) { //5
							for (int f = 1; f <=9; f++) { //6
								for (int g = 1; g <=9; g++) { //7
									for (int h = 1; h <=9; h++) { //8
										for (int i = 1; i <=9; i++) { //9
											if (a!=b&&a!=c&&a!=d&&a!=e&&a!=f&&a!=g&&a!=h&&a!=i&&
	                                            b!=c&&b!=d&&b!=e&&b!=f&&b!=g&&b!=h&&b!=i&&
	                                            c!=d&&c!=e&&c!=f&&c!=g&&c!=h&&c!=i&&
	                                            d!=e&&d!=f&&d!=g&&d!=h&&d!=i&&
	                                            e!=f&&e!=g&&e!=h&&e!=i&&
	                                            f!=g&&f!=h&&f!=i&&
	                                            g!=h&&g!=i&&
	                                            h!=i) { //判断每个数之间不相等
												int zuo=a+i+d+c;
												int you=a+f+h+b;
												int xia=c+g+e+b;
												if (zuo==you&&you==xia&&zuo==xia) {
													sum++;
												}
											}
											
										}
									}
								}
							}
						}
					}
				}
			}
		}
		System.out.println(sum/6);//旋转3  镜像2
    }
}
全排列:(在网上找的大佬的方法)
public class 纸牌三角屋 {
    static int[] a={1,2,3,4,5,6,7,8,9};
    static int ans;
    public static void main(String[] args) {
        dfs(0);
        System.out.println(ans/6);//答案为144
    }
    public static boolean check(){
        int x1=a[0]+a[1]+a[3]+a[5];
        int x2=a[0]+a[2]+a[4]+a[8];
        int x3=a[5]+a[6]+a[7]+a[8];
        return x1 == x2 && x2 == x3;
    }
    public static void dfs(int k){
        if(k==9&&check()){
            ans++;
        }
        for (int i = k; i <9; i++) {
            int t=a[k];
            a[k]=a[i];
            a[i]=t;
            dfs(k+1);
            t=a[k];
            a[k]=a[i];
            a[i]=t;
        }
    }
}

🚀最后

            让我们红尘作伴,活得潇潇洒洒,拿下蓝桥。

蓝桥.jpg

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。