——>>汝佳新書閱讀說明中的例題,大牛就是大牛!過程中兩個思想:1、兩只螞蟻相撞後假設互穿而過得最終各螞蟻位置;2、終態各螞蟻的相對位置不變,與始態相同。 [cpp] #include <iostream> #include <algorithm> using namespace std; const int maxn = 10000 + 10; struct ant //定義螞蟻數據類型 { int id; //輸入時的id編號,從0開始計數 int pos; //距左端的位置 int dir; //方向 bool operator < (const ant &a) const //重載運算符,按位置前後為序 { return pos < a.pos; } }; ant before[maxn], after[maxn]; //未處理前的before,處理後為after const char dir_name[][10] = {"L", "Turning", "R"}; //方向數組 int order[maxn]; //輸入的第i只螞蟻是位置上的第order[i]只 int main() { int N, L, T, n, i, position, change_c, cnt = 1; char c; cin>>N; while(N--) { cin>>L>>T>>n; for(i = 0; i < n; i++) { cin>>position>>c; if(c == 'L') change_c = -1; //轉一下,等下計算終態與輸出都方便 else change_c = 1; before[i] = (ant){i, position, change_c}; after[i] = (ant){0, position + T*change_c, change_c}; //計算終態,其中id無太大用處,可賦個默認值 } sort(before, before+n); //按位置排序 for(i = 0; i < n; i++) order[before[i].id] = i; //賦值,使輸入的第i只螞蟻是位置上的第order[i]只 sort(after, after+n); //按位置排序 for(i = 0; i < n-1; i++) //修改方向 if(after[i].pos == after[i+1].pos) { after[i].dir = 0; after[i+1].dir = 0; } cout<<"Case #"<<cnt++<<":"<<endl; for(i = 0; i < n; i++) { int a = order[i]; //輸入的第i只為位置上的第a只 if(after[a].pos < 0 || after[a].pos > L) cout<<"Fell off"<<endl; else cout<<after[a].pos<<" "<<dir_name[after[a].dir+1]<<endl; } cout<<endl; } return 0; }