1. 程式人生 > >3星難度-算式填符號

3星難度-算式填符號

幫助 一個 space ret 計算 可能 span nbsp pre

題目:
匪警請撥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<iostream>
#include
<algorithm> #include<string.h> #include<stdio.h> 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 -還是+ { s[cnt]=c; if(cnt==9) {
if(limit) ans-=sum;//註意把最後一個數加上去 else ans+=sum; if(ans==110) { //for(int i=1;i<10;i++) cout<<s[i]; //cout<<endl; for(int i=1;i<10;i++) { printf("%d",a[i]); if(s[i]!=*&&(i<9)) printf("%c",s[i]); } cout<<endl; an++; } return ; } if(c==+)//這個空是+ 代表前面就已經和後面的斷了 { if(limit) { if(cnt!=8) { solve(cnt+1,ans-sum,a[cnt+1],*,false); solve(cnt+1,ans-sum,a[cnt+1],-,false); solve(cnt+1,ans-sum,a[cnt+1],+,false); } else solve(cnt+1,ans-sum,a[cnt+1],*,false); } else { if(cnt!=8) { solve(cnt+1,ans+sum,a[cnt+1],*,false); solve(cnt+1,ans+sum,a[cnt+1],-,false); solve(cnt+1,ans+sum,a[cnt+1],+,false); } else solve(cnt+1,ans+sum,a[cnt+1],*,false); } //sum+=a[cnt]; } if(c==-) { //a[cnt+1]=-a[cnt+1]; if(limit) { if(cnt!=8) { solve(cnt+1,ans-sum,a[cnt+1],*,true); solve(cnt+1,ans-sum,a[cnt+1],-,true); solve(cnt+1,ans-sum,a[cnt+1],+,true); } else solve(cnt+1,ans-sum,a[cnt+1],*,true); } else { if(cnt!=8) { solve(cnt+1,ans+sum,a[cnt+1],*,true); solve(cnt+1,ans+sum,a[cnt+1],-,true); solve(cnt+1,ans+sum,a[cnt+1],+,true); } else solve(cnt+1,ans+sum,a[cnt+1],*,true); } } if(c==*)//這個箜是* 代表前面的和後面的還沒有斷 { if(cnt!=8) { solve(cnt+1,ans,sum*10+a[cnt+1],+,limit); solve(cnt+1,ans,sum*10+a[cnt+1],-,limit); solve(cnt+1,ans,sum*10+a[cnt+1],*,limit); } else solve(cnt+1,ans,sum*10+a[cnt+1],+,limit); } } int main() { //第一個空三種情況 for(int i=1;i<10;i++) a[i]=i; solve(1,0,1,*,false); for(int i=1;i<10;i++) a[i]=i; solve(1,0,1,-,false); for(int i=1;i<10;i++) a[i]=i; solve(1,0,1,+,false); cout<<an<<endl; return 0; }

3星難度-算式填符號