程式碼
因為自己電腦用瘋狂程式寫code好像無法使用c++11的編譯器(?),所以才自己寫了stoi。
我用 struct 來紀錄怎麼forward,用vector紀錄全部的forward資訊,以及forward的過程中經過哪些電話號碼,如果會forward到已經記錄過的就回傳9999。
至於判斷時間起迄的部分,除了一般的狀況外,還要考慮時間可能跨到明年,也就是結束時間比開始時間小的情況。
還有一個部份是要確認長長的forward鍊已經到了最後,要怎麼確認呢?我的想法是只要該輪有被更動過,下次就要再檢查一次,直到某輪把所有forward資訊看過一次都不用,那就結束。
解題心得
#include <iostream> #include <vector> using namespace std; struct forward_call { string source, target; int start, end; }; int stoi(string s) { int n=0; for(int i=0;i<s.length();i++) { n=n*10+s[i]-'0'; } return n; } bool in_history(vector<string> history, string s) { for(int i=0;i<history.size();i++) { if(history[i]==s) return true; } return false; } bool in_time(int start, int end, string time) { if(start<=end) if(start<=stoi(time) && stoi(time)<=end) return true; else if(!(end<=stoi(time) && stoi(time)<=start)) return true; return false; } int main() { int T; cin>>T; cout<<"CALL FORWARDING OUTPUT"<<endl; for(int round=1; round<=T; round++) { string s, t, d, target; string time, extension; vector<forward_call> sys; cout<<"SYSTEM "<<round<<endl; while(cin>>s) { if(s=="0000") break; cin>>t>>d>>target; forward_call call; call.source=s;call.target=target;call.start=stoi(t);call.end=stoi(t)+stoi(d); sys.push_back(call); } while(cin>>time) { if(time=="9000") break; cin>>extension; string initial_extension=extension; vector<string> history; history.push_back(initial_extension); bool isFin=true; do{ isFin=true; for(int i=0;i<sys.size();i++) { if(sys[i].source==extension && sys[i].start <= stoi(time) && stoi(time) <= sys[i].end) { isFin=false; if(in_history(history, sys[i].target)) { extension = "9999"; break; } extension=sys[i].target; history.push_back(sys[i].target); } } }while(!isFin); cout<<"AT " << time << " CALL TO " << initial_extension << " RINGS " << extension << endl; } } cout<<"END OF OUTPUT"<<endl; return 0; }
沒有留言:
張貼留言