UVa 133-The Dole Queue【シミュレーション】

1426 ワード

原文URL:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=832&page=show_problem&problem=69
本当に酔っ払って、もともと簡単に見える問題は、長い間やらなければならないので、問題があまりにも葛藤しているのか、それとも自分の基礎知識がしっかりしていないのか分からない......
一群の人が1つの輪を囲んで、1つの起点から、時計回りと反時計回りに数を数えて、ある数字を数えたときに停止して、最後の2つの方法で数えた数字は1つか2つあって、それから出力して(繰り返して出力しない)、このような規則的な出隊順序を求めます......
の配列を使ってシミュレーションして、感じは本当に不快です.....奇妙な感じで、最も注意しなければならないのは境界の処理と、出力の下付きと操作の下付きの対応関係です.
#include<stdio.h>
#include<string.h>
int n,k,m,x[25];
int count(int bg,int turn,int step)//   
{
	int cnt=0,i=bg;
	while(cnt<turn)
	{
		if(step<0&&i==0)//         ,       
		{
			i=n;
		}
		i+=step;//step               
		if(x[i%n])
		{
			++cnt;
		}
	}
	return i%n;//      
}
void slove()
{
	memset(x,-1,sizeof(x));
	int cnt=0,left=-1,right=n;//            
	while(cnt<n)
	{
		if(cnt)//     
		{
			printf(",");
		}
		left=count(left,k,1);//      
		right=count(right,m,-1);//      
		printf("%3d",left+1);
		x[left]=0;//        
		++cnt;
		if(right!=left)//         
		{
			printf("%3d",right+1);
			++cnt;
			x[right]=0;
		}
	}
	printf("
"); return ; } int main() { //freopen("shuju.txt","r",stdin); while(scanf("%d%d%d",&n,&k,&m),n|m|k) { slove(); } return 0; }

書き終わってから気づいたのですが、両端の列でシミュレーションしてみてもいいようで、簡単に酔っ払うはずですが...