題目連結:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1180
題目描述:
有N個人圍成一圈,按順時針給他們編号為1-N。
緊接着,指定編号為M的人開始報數,報數按順時針進行。
報到D的人出列,下一個人重新開始報數。按此規律,每次報到D的人都出列。
要求同學程式設計求出出列的順序。
Input:
輸入包括多組測試用例。
對于每組用例,第一行是一個整數N,表示人數。N<100。
接下來N行是每個人的人名。人名為長度不超過20連續字元串。
最後是以兩個以","分割的整數M,D。代表從M個人開始,每報D個數出列。
Output:
輸出所求的順序
Sample Input:
8
Zhao
Qian
Sun
Li
Zhou
Wu
Zheng
Wang
4,4
Sample Output:
Zheng
Sun
Wang
Zhou
Li
Wu
Qian
Zhao
思路分析:
1.首先要知道一點,人數是有限的,圍成一個圈,标号從0-N,對數進行取N的餘數,可以構成一個圈進行循環。
2.需要解決的有三個問題,第一個數控制程式結束,即所有人都已經報數了,這個可以定義一個計數的變量,放在最外層循環。
3.第二個問題,每次有人報過數之後,需要按順時針走D步,而且已經報過數的人不算數。可以用一個flag數組來控制某個人是否報過數,具體實作看代碼
4.第三個問題,輸出報數的人,先判斷這個人是不是報過數,如果報過數,進行循環,按順時針方向,直到找到一個沒有報過數的人,進行報數。
代碼實作:
#include<iostream>
using namespace std;
int main()
{
int i,N,M,D;
char a;
string s[101];
while(cin>>N)
{
for(i=0;i<N;i++)
cin>>s[i];
cin>>M>>a>>D;
int l=0,flag[101]={0};
i=M-1;
while(l<N)
{
for(int k=0;k<D-1;k++)//這個循環的作用是走D步,而且已經報過數的人不能算數
{
while(flag[i]==1)
{
i++;
i=i%N;
if(flag[i]==0)
break;
}
i++;
i=i%N;
}
while(flag[i]==1)//這個循環的作用是確定目前位置的人沒有報過數
{
i++;
i=i%N;
if(flag[i]==0)
break;
}
//接下來就是輸出報數的人
cout<<s[i]<<endl;
flag[i]=1;
i++;
i=i%N;
l++;
}
}
return 0;
}
: