匪警请拨110,即使手机欠费也可拨通!
为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!
某批警察叔叔正在进行智力训练:
1 2 3 4 5 6 7 8 9 = 110;
请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号)。之间没有填入符号的数字组合成一个数,例如:12+34+56+7-8+9 就是一种合格的填法;123+4+5+67-89 是另一个可能的答案。
请你利用计算机的优势,帮助警察叔叔快速找到所有答案。
每个答案占一行。形如:
12+34+56+7-8+9
123+4+5+67-89
......
已知的两个答案可以输出,但不计分。
各个答案的前后顺序不重要。
思路:一开始第一个字符肯定是1,对于接下来的选择有三种可能
要么是数字,要么是+,要么是- ,对这三种情况dfs
一些细节问题需要注意:
https://blog.csdn.net/daoshen1314/article/details/103328514
https://blog.csdn.net/daoshen1314/article/details/89396856
代码:
import java.util.Scanner;
public class Main {
public static boolean check(String s){
char a[]=s.toCharArray();
int sum=0;
boolean flag=true;
int x=0,ans=0;
for(int i=0;i<a.length;i++){
if(a[i]=='+'||a[i]=='-'){
if(flag) ans+=x;
else ans-=x;
if(a[i]=='+') flag=true;
else flag=false;
x=0;
}
else{
x=x*10+a[i]-'0';
}
}
if(flag) ans+=x;
else ans-=x;
return ans==110;
}
public static void dfs(int id,String s){
if(id>9){
if(check(s)) System.out.println(s);
return;
}
//数字
String ss=s;
ss=ss+id;
dfs(id+1,ss);
//字符串+数字->数字会自动转换成字符串
//+
ss=s;
ss=ss+'+';
ss=ss+id;
dfs(id+1,ss);
//-
ss=s;
ss=ss+'-';
ss=ss+id;
dfs(id+1,ss);
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
dfs(2,"1");//1是固定的,从2开始
}
}