思考の問題で行き詰まった水問題
トピック
カウントゲームは次のようになります。円の中にはn人がいて、番号は1からnまで順番に番号が付けられています。最初の人から数え始め、m(<n)に報告する人は円から出ます。次の人は1から数え始め、mに報告する人は円から出ます。これは最後の人が去るまで続きます。
この質問では、各人の出口注文番号を指定して関数を作成する必要があります。
関数インターフェースの定義
void CountOff(int n、int m、int out []);
ここで、nは初期の人数、mはゲームで指定された終了順序です(n未満の正の整数であることが保証されています)。関数CountOffは、配列out []内の各人の終了順序番号を格納します。C言語配列の添え字は0から始まるため、i番目の位置にいる人はout [i-1]番目の出口にいます。
審判のテスト手順の例
#include <stdio.h>
#define MAXN 20
void CountOff( int n, int m, int out[] );
int main()
{
int out[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
CountOff( n, m, out );
for ( i = 0; i < n; i++ )
printf("%d ", out[i]);
printf("\n");
return 0;
}
/* 你的代码将被嵌在这里 */
入力サンプル
11 3
サンプル出力
4 10 1 7 5 2 11 9 3 6 8
この質問に陥りやすい考え方の誤解は、出力が順番に排除された人の数であると誤って信じることであり(つまり、サンプル出力は3、6、9 ...である必要があります)
、実際の出力は対応する番号が削除されたラウンド数になります(出力サンプルのうち、1、2、3はラウンド数を表し、最初のラウンドで3番の人の削除を表し
ます。など)はるかに簡単になります。出力原理を理解するために〜
コード:
void CountOff( int n, int m, int out[] )
{
int j=0,count=0,item=0;
for(int i=0;i<n;i++)
out[i]=0;//数组初始化
while(1){
if(out[j++]==0)
count++;
if(count==m){
item++;
out[j-1]=item;
count=0;
}
if(item==n)
break;//当仅剩最后一人时 跳出while循环
j=j%n;
}
}