石取りゲーム
- ルール
- 1〜nの番号を書いた石を順に時計回りにおく。
- 事前にkとmという二つの数が与えられる。
- まずm番の石を取り除く。
- そのm番の石から時計回りにk番目の石を取り除く。
- ただし、取り除かれた石は数えない。
- 入力
- 出力
- 最後に残る石の番号がデータセットとして出力される。
- スペースなどの余分な文字は出力しない。
深く考えずに円のリスト作って、消してつなげてをぐるぐると。
遅い。
freeが重そう。
プログラムリスト
#include<stdio.h> #include<stdlib.h> typedef struct stone{ int number; struct stone *next; }Stone; Stone *RemoveStone(struct stone *pos,int k); int main(void){ FILE *fpi,*fpo; int n,k,m,cnt; int StoneSize = sizeof(Stone); Stone *root,*pos; if((fpi=fopen("A.in","r"))==NULL){ fprintf(stderr,"NO:A.in"); exit(-1); } if((fpo=fopen("Result.txt","w"))==NULL){ fprintf(stderr,"ERROR:CAN'T MAKE OUTPUT FILE"); exit(-2); } root=pos=malloc(StoneSize); while(fscanf(fpi,"%d %d %d",&n,&k,&m)!=EOF){ if(n==0 && k==0 && m==0) break; m--; for(cnt=1;cnt<n;cnt++){ pos->number=cnt; pos->next=malloc(StoneSize); pos=pos->next; } pos->number=cnt; pos->next=root; pos=root; while(pos->number<m) pos=pos->next; fprintf(fpo,"%d\n",(root=pos=RemoveStone(pos,k))->number); } free(root); return 0; } Stone *RemoveStone(Stone *pos,int k){ int cnt; Stone *DeleteTarget; while(pos->next!=pos){ DeleteTarget=pos->next; pos->next=pos->next->next; free(DeleteTarget); for(cnt=1;cnt<k;cnt++) pos=pos->next; } return pos; }