爲了保障社會秩序,保護人民羣衆生命財產安全,警察叔叔需要與罪犯鬥智鬥勇,因而需要經常性地進行體力訓練和智力訓練!
某批警察叔叔正在進行智力訓練:
12 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
已知的兩個答案可以輸出,但不計分。
各個答案的前後順序不重要。
思路:數之間填符號("+","-",""),如果頭鐵可以八層循環3^8解決問題,頭不鐵用遞歸,出口條件容易找,關鍵是求得所需算式需要下些功夫。
代碼:
/* by KrKing from hhu
2018/3/21 */
#include <iostream>
#include <cstring>
using namespace std;
void f(int i,int sum,string str,int remain){
if(i == 10){
if(sum == 110 && (!remain) && (str[0] != '-')){
if(str[0] == '+')cout << &str[1] << endl;
else cout << str << endl;
}
return;
}
if(remain){
if(remain > 0){
f(i + 1,sum + 10*remain + i,str + char('0'+i),0);//殺雞取卵
f(i + 1,sum,str + char('0'+i),10*remain+i);//繼續疊加
}
else{
f(i + 1,sum + 10*remain - i,str + char('0'+i),0);//殺雞取卵
f(i + 1,sum,str + char('0'+i),10*remain-i);//繼續疊加
}
}
else{
f(i + 1,sum + i,str + "+" + char('0'+i),0);
f(i + 1,sum - i,str + "-" + char('0'+i),0);
f(i + 1,sum,str + "+" + char('0'+i),i);
f(i + 1,sum,str + "-" + char('0'+i),-i);
}
}
int main(){
f(1,0,"",0);
return 0;
}