範例程式碼 uva10309

//uva10309
#include "cstdio"
#include "cstdlib"
#include "cstring"

char grid[12][12];
char light[12][12];

void invert(int r, int c) {
	if(light[r][c] != '#')
		light[r][c] = '#';
	else
		light[r][c] = 'O';
}

void press_light(int r, int c) {
	invert(r-1, c);
	invert(r, c-1);
	invert(r, c);
	invert(r, c+1);
	invert(r+1, c);
}

int test(int pattern) {
	int presses = 0;

	memcpy(light, grid, sizeof(grid));	
	for(int c = 1; c <= 10; c++) {
		if(pattern & 1) {
			press_light(1, c);
			presses++;
		}
		pattern >>= 1;
	}

	for(int r = 2; r <= 10; r++) {
		for(int c = 1; c <= 10; c++) {
			if(light[r - 1][c] == 'O') {
				press_light(r, c);
				presses++;
			}
		}
	}

	for(int c = 1; c <= 10; c++)
		if(light[10][c] == 'O')
			return -1;

	return presses;
}

int main(void) {
	char name[1024];
	while(fgets(name, sizeof(name), stdin) && strcmp(name, "end\n")) {
		for(int r = 1; r <= 10; r++)
			fgets(&grid[r][1], 13, stdin);

		int answer = 0x7FFFFFFF;
		for(int p = 0; p < 1024; p++) {
			int result = test(p);
			if(result >= 0 && answer > result)
				answer = result;
		}			
		if(answer == 0x7FFFFFFF)
			answer = -1;

		for(int i = 0; name[i]; i++) {
			if(name[i] == '\n') {
				name[i] = 0;
				break;
			}
		}
		printf("%s %d\n", name, answer);
	}	

	return 0;
}