题目:
看下面的算式:
□□ 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);
}
}