題目:
匪警請撥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
答案是10
這題到最後的確做出來了,但是花時間也太長了,乙個多小時吧 打比賽的時候可不能可這樣,感覺對dfs還是不夠熟悉 慢慢積累吧!
思路: 其實就是dfs每兩個數之間的符號,都有三種情況,+ - 另外乙個可以用乙個*來表示。 中間的都一樣的 但是邊界處理要注意!!!
首先是第乙個數 同樣的 + - *三種操作都不能少 總共需要填八個空 所以當知道是第八個空時 第九個空只需要填一次 不然就多算了兩次了 。
中間一些細節真的要注意! 特別是當是-的時候 後面一直是* 這種情情況也要考慮到!!
下面看**:
#include#include#include
#include
using
namespace
std;
const
int maxn=1000
;int
a[maxn];
char
s[maxn];
int an=0
;void solve(int cnt,int ans,int sum,char c,bool limit)//
cnt表示第幾位 ans表示到目前為止總和 sum表示當前遍歷的這個數是多少 c表示這個空填什麼 limit -還是+
cout
}return
; }
if(c=='
+')//
這個空是+ 代表前面就已經和後面的斷了
else solve(cnt+1,ans-sum,a[cnt+1],'
*',false
); }
else
else solve(cnt+1,ans+sum,a[cnt+1],'
*',false
); }
//sum+=a[cnt];
}
if(c=='-'
)
else solve(cnt+1,ans-sum,a[cnt+1],'
*',true
); }
else
else solve(cnt+1,ans+sum,a[cnt+1],'
*',true
); }
}if(c=='
*')//
這個箜是* 代表前面的和後面的還沒有斷
else solve(cnt+1,ans,sum*10+a[cnt+1],'+'
,limit);
}}int
main()
算式填符號
問題描述 匪警請撥 110,即使手機欠費也可撥通!為了保障社會秩序,保護人民群眾生命財產安全,警察叔叔需要與罪犯鬥智鬥勇,因而需要經常性地進行體力訓練和智力訓練!某批警察叔叔正在進行智力訓練 1 2 3 4 5 6 7 8 9 110 請看上邊的算式,為了使等式成立,需要在數字間填入加號或者減號 可...
C 算式填符號
題目描述 匪警請撥110,即使手機欠費也可撥通!為了保障社會秩序,保護人民群眾生命財產安全,警察叔叔需要與罪犯鬥智鬥勇,因而需要經常性地進行體力訓練和智力訓練!某批警察叔叔正在進行智力訓練 1 2 0 3 請看上邊的算式,為了使等式成立,需要在數字間填入加號或者減號 上述可能的方案為 1 2 0 3...
藍橋杯 算式填符號
匪警請撥110,即使手機欠費也可撥通!為了保障社會秩序,保護人民群眾生命財產安全,警察叔叔需要與罪犯鬥智鬥勇,因而需要經常性地進行體力訓練和智力訓練!某批警察叔叔正在進行智力訓練 1 2 3 4 5 6 7 8 9 110 請看上邊的算式,為了使等式成立,需要在數字間填入加號或者減號 可以不填,但不...