1 问题描述

看下面的算式:

□□ 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
.....

请编程,输出所有可能的情况!

注意:
左边的两个乘数交换算同一方案,不要重复输出!
不同方案的输出顺序不重要


2 解决方案

 import java.util.ArrayList;

 public class Main {
public static ArrayList<String> list = new ArrayList<String>(); public void swap(int[] A, int i, int j) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
} public 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 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) {
Main test = new Main();
int[] A = {1,2,3,4,5,6,7,8,9};
test.dfs(A, 0);
for(int i = 0;i < list.size();i++)
System.out.println(list.get(i));
}
}

运行结果:

46 x 79 = 23 x 158
54 x 69 = 27 x 138
54 x 93 = 27 x 186
58 x 67 = 29 x 134
58 x 69 = 23 x 174
58 x 73 = 29 x 146
58 x 96 = 32 x 174
63 x 74 = 18 x 259
64 x 79 = 32 x 158
73 x 96 = 12 x 584
76 x 98 = 14 x 532
05-18 06:50