- 凑算式(结果填空)
这个算式中A ~ I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
package 第七届;
public class _03凑算式dfs {
public static void main(String[] args) {
int vis[] = new int[10];
int nums[] = new int[10];
int ans = 0;
ans = dfs(nums,vis,1);
System.out.println(ans);
}
public static int dfs(int[] nums,int[] vis, int k) {
int ans = 0;
if(k == 10) {
if(check(nums)) {
return 1;
}
}
for(int i = 1; i < 10; i++) {
if(vis[i] == 0) {
vis[i] = 1;
nums[k] = i;
ans += dfs(nums,vis,k+1);
vis[i] = 0;//!!!回溯
}
}
return ans;
}
private static boolean check(int[] nums) {
int a = nums[1];
int b = nums[2];
int c = nums[3];
int d = nums[4]*100+nums[5]*10+nums[6];
int e = nums[7]*100+nums[8]*10+nums[9];
double end = (b*e+c*d)*1.00/(c*e);//用int的话,误差相当大,注意!!
if(a+end == 10.00) {
return true;
}
return false;
}
}
package 第七届;
//方法二,也是全排列,递归法
public class _0凑算式全排列 {
public static void main(String[] args) {
int nums[] = {1,2,3,4,5,6,7,8,9};
allLine(nums,0);
System.out.println(ans);
}
static int ans = 0;
private static void allLine(int[] nums, int k) {
if(k == nums.length-1) {
if(check(nums)) {
ans++;
}
}
for(int i = k; i < nums.length; i++) {
int temp = nums[k];
nums[k] = nums[i];
nums[i] = temp;
allLine(nums,k+1);
temp = nums[k];
nums[k] = nums[i];
nums[i] = temp;
}
}
private static boolean check(int[] nums) {
int a = nums[0];
int b = nums[1];
int c = nums[2];
int d = nums[3]*100+nums[4]*10+nums[5];
int e = nums[6]*100+nums[7]*10+nums[8];
double end = (b*e+c*d)*1.00/(c*e);
if(a+end == 10.00) {
return true;
}
return false;
}
}