# APCS 小群體(10603 第2 題) :::success   ::: ```cpp= #include <iostream> using namespace std; const int MAXN = 50000+10; //最大的人數 int myfriend[MAXN]; //儲存每個人的好友編號 int check[MAXN]; //紀錄是否已被檢查過 int main() { int n; //團體中人數 while(cin>>n){ //依序讀入n個人的好友編號存入myfriend陣列 for(int i=0;i<n;i++){ //將第i個人的好友編號存入 cin>>myfriend[i]; //第i個人還未被檢查到 check[i]=0; } int counter=0; //小群體個數 int next=-1; //下一個編號(索引) for(int i=0;i<n;i++){ //判斷第i個人的好友是否被檢查過 if(!check[i]){ //如果第i個人的好友是自己的話 if(i==myfriend[i]){ counter++; //小群體++ check[i]=1; //第i個位置被檢查過時設為1 }else{ //好友不是自己時 next = i; //往下繼續找 //如果下一個索引沒被檢查過 while(!check[next]){ check[next]=1; //設定下一個索引被檢查過了 next=myfriend[next]; //將目前檢查的索引好友編號設為下一個要檢查的好友編號 } counter++; } } } cout<<counter<<"\n";//顯示群體個數 } return 0; } ``` # APCS 定時K 彈(10510 第3 題) :::success  ::: ```cpp= #include <iostream> #include<vector> //for vector using namespace std; //宣告 vector 物件 vector<int> arr; //儲存環狀陣列的元素 int main() { int n,m,k; //n個人數,每m次爆炸,總共爆炸k次 while(cin>>n>>m>>k){ //清除 arr(vector物件) 的所有元素 arr.clear(); //從 1~n 加入到arr(vector物件)中 for(int i=1;i<=n;i++){ //從尾端(tail)加入 arr.push_back(i); } //模擬炸彈爆炸k次 int curPos=0; for(int i=0;i<k;i++){ //每間隔 m 個元素爆炸一次 //算出要爆炸的位置索引(Joseph problem) curPos = (curPos + m -1) % arr.size(); //將 curPos 的元素從 arr(vector物件) 中刪除 arr.erase(arr.begin()+curPos); } //重新計算 curPos 在 arr(vector物件)中的索引 curPos = curPos % arr.size(); //輸出結果 cout<<arr[curPos]<<"\n"; } return 0; } ``` # 棒球遊戲 :::success  ::: ```cpp= #include <iostream> //#include <string> using namespace std; const int LINE = 9; //9位打者 const int HIT = 5; //每人最多打數 // 儲存每一個打者的打擊資料 int pitch[LINE]; //儲存每一個打者的打數資料 int his[LINE][HIT]; //紀錄壘包上的打者,true代表壘包上有人 bool bases[4]; int converter(string s) { if(s.compare("1B")==0) return 1; if(s.compare("2B")==0) return 2; if(s.compare("3B")==0) return 3; if(s.compare("HR")==0) return 4; return 0; } int getScore(int x) { int res = 0; //打出x壘時總得分 //依據壘包上是否有人且可能得分的壘包計算得分 for(int i=3; i>3; i--){ //如果第i個壘包目前有人 if(bases[i]){ //得1分 res++; } } //第 i 個壘包往前推進 x 個壘包 for(int i=3; i>x; i--){ //第 i 個壘包變成第 i-x 壘包的值(推進x壘包來到i壘包) bases[i]=bases[i-x]; } //全壘打 if(x==4){ res++; } else{ bases[x]=true;//打者上x壘 } //清空x壘之前的壘包 for(int i=1; i<x; i++){ bases[i]=false; } return res; //回傳打出 } int getScore1(int x) { int res = 0; cout<<"x="<<x<<"\n"; if(x==1){ res+=bases[3]; bases[3]=bases[2]; bases[2]=bases[1]; bases[1]=1; }else if(x==2){ res+=bases[3]+bases[2]; bases[3]=bases[1]; bases[2]=true; bases[1]=false; }else if(x==3){ res+=bases[3]+bases[2]+bases[1]; bases[3]=true; bases[2]=bases[1]=false; }else if(x==4){ res+=bases[3]+bases[2]+bases[1]+1; bases[3]=bases[2]=bases[1]=false; } cout<<res<<"\n"; return res; } int main(){ string s; //紀錄打者打數的字串1B,2B,....FO,SO for(int i=0; i<LINE; i++){ //第i個人的打數資料存入pitch陣列中 cin>>pitch[i]; //將第i個人的每一個打數資料 存入 hit 陣列中 for(int j=0;j<pitch[i];j++){ cin>>s; //字串 his[i][j] = converter(s); //cout<<his[i][j]<<"\n"; } } // 總出局數 int outs; cin>>outs; /*模擬動作開始*/ //所有壘包清空 bases[0]= bases[1]= bases[2]= bases[3]=0; //Column-Major(以行為主)讀取 HIT陣列資料 int scores = 0; //紀錄得分 int out=0; //紀錄累積出局數(3的倍數要清空所有壘包) for(int i=0; i<HIT && out<outs; i++){ for(int j=0; j<LINE && out<outs; j++){ //如果[j][i]不為0(可能會產生得分) if(his[j][i]){ scores+=getScore1(his[j][i]); cout<<scores<<"\n"; } else{ out++; //累計出局數加1 if(!(out%3)){ //所有壘包清空 bases[3]= bases[2]= bases[1]= bases[0]=0; } } } } cout<<scores; return 0; } ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up