猜算式

题目:

看下面的算式:
□□ x □□ = □□ x □□□
它表示:两个两位数相乘等于一个两位数乘以一个三位数。
如果没有限定条件,这样的例子很多。
但目前的限定是:这9个方块,表示1~9的9个数字,不包含0。
该算式中1至9的每个数字出现且只出现一次!
比如:
46 x 79 = 23 x 158
54 x 69 = 27 x 138
54 x 93 = 27 x 186
.....
请编程,输出所有可能的情况!
注意:
左边的两个乘数交换算同一方案,不要重复输出!
不同方案的输出顺序不重要

依旧是dfs。

第一遍写的时候用的话数组。

源代码:

public class CaiSS {

    boolean[] a=new boolean[10];
    public void dfs(int n,int[] b)
    {
        if(n==10)
        {
            for(int i=1;i<=9;i++)
                if(a[i]==false)
                    return ;
            if((b[1]*10+b[2])*(b[3]*10+b[4])==(b[5]*10+b[6])*(b[7]*100+b[8]*10+b[9]))
            {
                System.out.println((b[1]*10+b[2])+"*"+(b[3]*10+b[4])+"="+(b[5]*10+b[6])+"*"+(b[7]*100+b[8]*10+b[9]));

            }
            return ;
        }
        for(int i=1;i<=9;i++)
        {
            if(a[i]==true)
                continue;
            b[n]=i;
            a[i]=true;
            dfs(n+1,b);
            a[i]=false;
        }
    }
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        int[] b=new int[10];
        new CaiSS().dfs(1,b);
    }

}

第二遍写的用list,方法相同。

源代码:

import java.util.ArrayList;
import java.util.List;

public class CaiSS1 {

    public void dfs(List<Integer> list,int n)
    {
        if(n==9)
        {
            int a=list.get(0)*10+list.get(1);
            int b=list.get(2)*10+list.get(3);
            int c=list.get(4)*10+list.get(5);
            int d=list.get(6)*100+list.get(7)*10+list.get(8);
            if(a*b==c*d)
            {
                System.out.println(a+"*"+b+"="+c+"*"+d);
            }
            return ;
        }
        for(int i=1;i<10;i++)
        {
            if(list.contains(i))//检查list里有没有出现过此数字
                continue;
            list.add(i);
            dfs(list,n+1);
            list.remove(n);
        }
    }
    public static void main(String[] args) {
        // TODO 自动生成的方法存根

        List<Integer> list=new ArrayList<Integer>();
        new CaiSS1().dfs(list,0);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值