十全时数——java代码(深搜)

假如电子计时器所显示的十个数字是“1115093028”这样一串数,它表示的数是11月15日9时30分28秒.
在这串数中,“0”出现了2次,“1”出现了三次,“2”、“3”、“5”、“8”、“9”各出现了一次,
而“4”、“6”、“7”没有出现.如果在电子计时器所显示的这串数里,0,1,2,3,4,5,6,7,8,9这
十个数字都只出现一次,称它所表示的时刻为“十全时”,那么2003年一共有__个这样的“十全时”.
注:按24小时制记时.

首先,闰年不可能多出十全时,因为0229已经有重复数字了。

那么,一年有多少个十全时呢?下面给出一个“另解”。

月可以是01到12,日可以是01到31,时可以是00到23,分可以是00到59,秒也可以是00到59。
也就是说,6,7,8,9只能做个位数字,4和5如果放到十位数字上只能是分和秒的十位数字。
那么,第五个个位数字是什么呢?

如果是0,则月的十位是1,只能是10月,这样时最少是26,不合理;
如果是1,同样,2,3也无法合理安排到月,日,时的十位;
如果是2,同样,3也无法合理安排到月,日,时的十位;
如果是3,应该把0,1,2安排到月,日,时的十位,4和5放到分和秒的十位。月的十位必须是0。
如果2放到日的十位,安排4和5有2种方法,3,6,7,8,9有5!=120种方法,共240种;
如果2放到时的十位,则时只能是23,安排4和5有2种方法,6,7,8,9有4!=24种方法,共48种。
此类小计288种。

如果是4或5,此时有2种选法。月的十位是0,时的十位是1,月的十位是2。时和分的十位有2种选法,
五个数的个位仍有5!=120种方法,共有2×2×120=480种。
共计288+480=768种。

下面给出详细代码解决过程

package cn.hncu.shiquanshu;


public class Shiquanshu {
    static int count=0;
    public static void main(String[] args) {
        String str="";
        sqs(str);//进行递归运算
        System.out.println(count);
    }

    private static void sqs(String str) {
        if(str.length()==10){
            System.out.println(str);
            count++;
            return;
        }
        String temp=new String(str);
        for(int i=0;i<=9;i++){
            if(validate(str, ""+i)){
                str+=i;
                sqs(str);
            }
            str=new String(temp);
        }

    }


    private static boolean validate(String str,String x) {
        if(str!=null&&str.length()>0){
            if(str.indexOf(x)>=0){
                return false;
            }
            if(str.length()>0){
                if(str.charAt(0)>'1'){
                    return false;
                }
            }
            if(str.length()>1){
                if(str.charAt(0)=='1'){
                    if(str.charAt(1)>'2'){
                        return false;
                    }
                }
            }
            if(str.length()>2){
                if(str.charAt(2)>'3'){
                    return false;
                }
            }
            if(str.length()>3){
                if(str.charAt(2)=='3'){
                    if(str.charAt(3)>'1'){
                        return false;
                    }
                }
            }
            if(str.length()>4){
                if(str.charAt(4)>'2'){
                    return false;
                }
            }
            if(str.length()>5){
                if(str.charAt(4)=='2'){
                    if(str.charAt(5)>'3'){
                        return false;
                    }
                }
            }
            if(str.length()>6){
                if(str.charAt(6)>'5'){
                    return false;
                }
            }
            if(str.length()>8){
                if(str.charAt(8)>'5'){
                    return false;
                }
            }
        }
        return true;
    }


}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值