天天看點

USACO 1.1 Broken Necklace (模拟)

<pre name="code" class="cpp">#include <stdio.h>
#define DEBUG 0
#define TESTCASES 8

#define LEN_NECKLACE 350
#define MOD(x) ( (x) < 0 ? (x) + numOfBeads : (x) % numOfBeads )//用取模操作來模拟環的技巧真贊

int numOfBeads;
char necklace[LEN_NECKLACE + 1];

int collect(int brokenBead, int direction){
	int color = 'w';
	int bead = MOD(brokenBead);
	int beadsCollected;
	for (beadsCollected = 0; beadsCollected < numOfBeads; beadsCollected++){
		//colory用來對比的顔色,初始化為白色,遇到非白的珠子便更新為相應的顔色
		if (color == 'w' && necklace[bead] != 'w')
			color = necklace[bead];
		//如果color和要收集的珠子的顔色都非白而且不同顔色,停止收集
		if (color != 'w' && necklace[bead] != 'w' && necklace[bead] != color)
			break;
		bead = MOD(bead + direction);
	}
	return beadsCollected;
}

int main(){
#if DEBUG
	int testCase;
	for (testCase = 1; testCase <= TESTCASES; testCase++){
		char inputFileName[20] = "necklace.inX";
		inputFileName[11] = '1' +  (testCase - 1);
		freopen(inputFileName, "r", stdin);
		printf("#%d\n", testCase);
#endif
	
	scanf("%d %s", &numOfBeads, necklace);

	int maxBeadsCollected = 0;
	int beadsCollected = 0;
	int lastbead = numOfBeads - 1;
	int bead;
	for (bead = 0; bead < lastbead ; bead++){
		//主循環:往兩個方向收集珠子,斷點在bead和bead+1之間
		beadsCollected = collect(bead, -1) + collect(bead + 1, 1);
		if (beadsCollected > maxBeadsCollected)
			maxBeadsCollected = beadsCollected;
	}
	
	if (maxBeadsCollected > numOfBeads)
		maxBeadsCollected = numOfBeads;

	printf("%d\n", maxBeadsCollected);

#if DEBUG
	}
#endif
	return 0;
}