看这个算式:
☆☆☆ + ☆☆☆ = ☆☆☆
如果每个五角星代表 1 ~ 9 的不同的数字。
这个算式有多少种可能的正确填写方法?
173 + 286 = 459
295 + 173 = 468
173 + 295 = 468
183 + 492 = 675
以上都是正确的填写法!
注意:
111 + 222 = 333 是错误的填写法!
因为每个数字必须是不同的!
也就是说:1~9中的所有数字,每个必须出现且仅出现一次!
注意:
不包括数字“0”!
注意:
满足加法交换率的式子算两种不同的答案。
所以答案肯定是个偶数!
注意:
只要求计算不同的填法的数目
不要求列出所有填写法
更不要求填写源代码!
其实这一题的思路就是全排列 插符号 9个位置插1-9 9个数字 295+173=468
和173+295=468 是两种答案 意味着这题也不需要查重 所以递归全排列 求符合条件的即可!
import java.util.Vector;
public class Main14 {
public static long count=0;
//还是1-9全排列的问题 如果加法交换律算两种答案的话 那么意味着不要查重
public static boolean matchResult(Vector<Character> result){
int a=(result.elementAt(0)-'0')*100+(result.elementAt(1)-'0')*10+(result.elementAt(2)-'0');
int b=(result.elementAt(3)-'0')*100+(result.elementAt(4)-'0')*10+(result.elementAt(5)-'0');
int c=(result.elementAt(6)-'0')*100+(result.elementAt(7)-'0')*10+(result.elementAt(8)-'0');
if(a+b==c){
System.out.printf("%d + %d =%d\n",a,b,c);
return true;
}
return false;
}
public static void fullPermutation(Vector<Character> source ,Vector<Character> result){
if(source.size()==0&&matchResult(result)){
count++;
return;
}
for(int i=0;i<source.size();i++){
Vector<Character> tsource =new Vector<>(source);
Vector<Character> tresult =new Vector<>(result);
tsource.remove(i);
tresult.add(source.elementAt(i));
fullPermutation(tsource, tresult);
}
}
public static void main(String[] args) {
Vector<Character> source=new Vector<>();
Vector<Character> result=new Vector<>();
for(int i=0;i<9;i++){
source.add((char)('0'+(i+1)));
}
fullPermutation(source, result);
System.out.println(count);
}
}
fullPermutation 全排列基本套路 <1>定义出口 <2>递归循环
关键代码
for(int i=0;i<source.size();i++){
Vector<Character> tsource =new Vector<>(source);
Vector<Character> tresult =new Vector<>(result);
tsource.remove(i);
tresult.add(source.elementAt(i));
fullPermutation(tsource, tresult);
}
还有一种写法
for(int i=0;i<source.size();i++){
result.add(source.elementAt(i));
source.remove(i);
fullPermutation(source, result);
//复位
source.add(i, result.elementAt(result.size()-1));
result.remove(result.size()-1);}