程式碼
因為自己電腦用瘋狂程式寫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;
}
沒有留言:
張貼留言