藍橋杯 趣味算式(遞歸)

    匪警請撥110,即使手機欠費也可撥通!

    爲了保障社會秩序,保護人民羣衆生命財產安全,警察叔叔需要與罪犯鬥智鬥勇,因而需要經常性地進行體力訓練和智力訓練!

    某批警察叔叔正在進行智力訓練:

    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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章