蓝桥杯决赛javaA组--凑平方数

题目描述


凑平方数

把0~9这10个数字,分成多个组,每个组恰好是一个平方数,这是能够办到的。
比如:0, 36, 5948721

再比如:
1098524736
1, 25, 6390784
0, 4, 289, 15376
等等…

注意,0可以作为独立的数字,但不能作为多位数字的开始。
分组时,必须用完所有的数字,不能重复,不能遗漏。

如果不计较小组内数据的先后顺序,请问有多少种不同的分组方案?

注意:需要提交的是一个整数,不要填写多余内容。


解题思想


/*
首先要明白的一个问题,就是0--9十个数,如何判断一种满足题意的情况,组合完成?
我的想法就是用一个index来跟踪当前枚举的是第几位。
这道题肯定要用dfs,因此递归结束的条件就可以写成index==10
直接说dfs(i,j)表示枚举的一种满足题意的十位数中的第i位,枚举到第j的平方,所代表的数
比如1,25,6390784这种情况
当枚举到j=1,的时候,满足条件,此时i=1,
然后当枚举到j=5,此时为25,i=3,。。
就是这样。
但是这要解决个问题,首先j的平方,要满足自身没有重复的数字,并且跟前面没有重复的数字。
因此问题就差不多解决了。
我这里写的是dfs(i,j,k)
其中k,表示的含义是枚举到第几列,用于输出。
*/

代码


import java.util.Scanner;
public class Main{
    static int[] vis = new int[10];//全程标记数组
    static int[] temVis =new int[10];//用于检测自身是否有重复
    static long[] res = new long[10];//存满足条件的一组组合,用作输出
    static int ant  = 0; //次数
    public static void main(String[] args){
        //i从第一位开始枚举,j从第几个数开始平方枚举,k当前这种情况的第几块数
        dfs(0,0,0);
        System.out.println(ant);
    }

    public static void dfs(int coun,long last, int resindex){
        if(coun == 10){
        //试探到第十个数,自然完成一组组合
            for(int i=0; i<resindex; ++i)
                System.out.print(res[i]+" ");
            System.out.println("-->"+(ant++));
            return;
        }
        for(long i=last; i<=100000; ++i){
            if(isNorepeat((long)i*i)){//如果自身没有重复的数字
            //并且与当前组合的前面数没有重复,说明当前的i*i可以成为组合的一部分
                mark(i*i); //更新全局标记数组

                int len = String.valueOf((long)i*i).length();//i*i长度
                coun += len; //coun表示当前组合的第几个数              
                res[resindex] = i*i; //用于输出,存满足条件的组合数据

                dfs(coun, i+1, resindex+1);

                remark((long)i*i);//返回上一层
                //这里说一下,为什么要返回上一层,
                //首先代码能执行到这里,有俩种情况
                //其一,递归结束条件有return
                //其二,循环终止
                //显然应该是递归终止,所以说明找到了一种情况,所以需要将当前标记消 
                //去,即返回上一层     
                coun -= len; //长度自然要减下去
            }
        }
    }
    //若此j的平方满足条件,则可以加入待组合的后面
    public static void mark(long num){
        if(num ==0){
            vis[0] = 1;
            return;
        }
        while(num != 0){
            vis[(int) (num%10)] = 1;
            num /= 10;
        }
    }
    //判断当前的数自身是否有重复的数字
    public static boolean isNorepeat(long num){
        for(int i=0; i<10; ++i)
            temVis[i] = 0;
        if(num == 0){
            if(vis[0] == 0){
              vis[0] = 1;
             return true;
            }else
                return false;
        }
        while(num != 0){
            if(temVis[(int) (num%10)]==1 || vis[(int) (num%10)]==1 ){
                return false;
            }
            temVis[(int) (num%10)] = 1;
            num /= 10;
        }
        return true;

    }
    //dfs后,返回上一层
    public static void remark(long num){
        if(num == 0){
            vis[0] = 0;
            return;
        }
        while(num != 0){
            vis[(int) (num%10)] = 0;
            num /= 10;
        }
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
2022年蓝桥杯Java A是中国著名的计算机竞赛之一,该比赛旨在发掘和培养优秀的Java程序设计人才。参赛者需要具备一定的Java编程基础和算法思维能力,通过解决一系列实际问题来展示自己的技术水平。 蓝桥杯Java A比赛内容将涉及Java语言基础知识、面向对象编程、数据结构与算法、数据库等方面。参赛选手需要通过模拟真实的工作场景,设计和实现各种功能模块,展现出自己解决问题的能力和代码的优雅性。 蓝桥杯Java A比赛对于参赛者来说是一次难得的锻炼机会。通过参加比赛,可以学习到实际项目中常用的技术和解决问题的思路,提高自己的编程能力。同时,这也是一个展示自己才华和与其他选手竞争的舞台,可以通过与其他优秀选手的交流互动,拓宽自己的视野,并且与同龄人一起追求计算机编程的进步。 参加蓝桥杯Java A比赛,不仅可以提升自己的技术能力,还能为自己的未来发展增加一份宝贵的竞赛经验。很多优秀的程序员和企业都非常看重蓝桥杯的参赛者,因为这代表着他们在编程领域具备一定的实力和潜力。 总而言之,参加2022年蓝桥杯Java A是一个对自己实力的检验和提高的机会,同时也是一个与其他优秀选手竞争的平台,可以通过比赛锻炼自己的技术能力和解决问题的能力。参赛者在比赛中要保持冷静和耐心,学会与其他选手交流和合作,相信通过努力,一定能够在比赛中取得好的成绩。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值