ツムラ_メモ

大失敗を繰り返す。

石取りゲーム

  • ルール
    • 1〜nの番号を書いた石を順に時計回りにおく。
    • 事前にkとmという二つの数が与えられる。
    • まずm番の石を取り除く。
    • そのm番の石から時計回りにk番目の石を取り除く。
    • ただし、取り除かれた石は数えない。
  • 入力
    • n k m のデータセットで与えられる。
    • 入力の終了は0 0 0。
    • n k mの間は半角スペース。
    • n k mはの条件を満たす。
    • データセットは100以下。
  • 出力
    • 最後に残る石の番号がデータセットとして出力される。
    • スペースなどの余分な文字は出力しない。

深く考えずに円のリスト作って、消してつなげてをぐるぐると。
遅い。
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;
}