猜算式

/*看下面的算式:
□□ 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
.....
请编程,输出所有可能的情况!
注意:
左边的两个乘数交换算同一方案,不要重复输出!
不同方案的输出顺序不重要

*/

1.  数的全排列的用法

2.递归、回溯知识

---------------------------------------------------code1----------------------------------------------------------------------------------------

import java.util.*;

import java.util.ArrayList;

public class demo1 {
    public static ArrayList<String> list = new ArrayList<String>();
    
    public static void swap(int[] A, int i, int j) {
        int temp = A[i];
        A[i] = A[j];
        A[j] = temp;
    }
    
    public static void check(int[] A) {
        int a = A[0] * 10 + A[1];
        int b = A[2] * 10 + A[3];
        int c = A[4] * 10 + A[5];
        int d = A[6] * 100 + A[7] * 10 + A[8];
        if(a > b) {//小数在前,大数在后
            int temp = a;
            a = b;
            b = temp;
        }
        if(a * b == c * d) {
            StringBuffer s = new StringBuffer("");
            s.append(a);
            s.append(" x ");
            s.append(b);
            s.append(" = ");
            s.append(c);
            s.append(" x ");
            s.append(d);
            if(!list.contains(s.toString()))
                list.add(s.toString());
        }
    }
    
    public static void dfs(int[] A, int step) {//使用递归
        if(step == A.length) {
            check(A);
            return;
        } else {
            for(int i = step;i < A.length;i++) {
                swap(A, i, step);//交换元素
                dfs(A, step + 1);
                swap(A, i, step);//还原元素
            }
        }
    }
    
    public static void main(String[] args) {       
        int[] A = {1,2,3,4,5,6,7,8,9};
        dfs(A, 0);
        for(int i = 0;i < list.size();i++)
            System.out.println(list.get(i));
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值