Party Lamps派对灯(IOI98)
[编辑] 描述在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码。 这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮。 按钮2:当按下此按钮,将改变所有奇数号的灯。 按钮3:当按下此按钮,将改变所有偶数号的灯。 按钮4:当按下此按钮,将改变所有序号是3*K+1(K>=0)的灯。例如:1,4,7... 一个计数器C记录按钮被按下的次数。当宴会开始,所有的灯都亮着,此时计数器C为0。 你将得到计数器C(0<=C<=10000)上的数值和经过若干操作后某些灯的状态。写一个程序去找出所有灯最后可能的与所给出信息相符的状态,并且没有重复。 [编辑] 格式PROGRAM NAME: lamps INPUT FORMAT: (file lamps.in) 不会有灯会在输入中出现两次。 第一行: N。 第二行: C最后显示的数值。 第三行: 最后亮着的灯,用一个空格分开,以-1为结束。 第四行: 最后关着的灯,用一个空格分开,以-1为结束。 OUTPUT FORMAT: (file lamps.out) 每一行是所有灯可能的最后状态(没有重复)。每一行有N个字符,第1个字符表示1号灯,最后一个字符表示N号灯。0表示关闭,1表示亮着。这些行必须从小到大排列(看作是二进制数)。 如果没有可能的状态,则输出一行'IMPOSSIBLE'。 [编辑] SAMPLE INPUT10 1 -1 7 -1 在这个样例中,有10盏灯,只有1个按钮被按下。最后7号灯是关着的。 [编辑] SAMPLE OUTPUT0000000000 0101010101 0110110110 在这个样例中,有三种可能的状态: 所有灯都关着 1,4,7,10号灯关着,2,3,5,6,8,9亮着。 1,3,5,7,9号灯关着,2, 4, 6, 8, 10亮着。 /* ID: liluvu1 LANG: C++ TASK: lamps */ #include <stdio.h> #include <string.h> #include <stdlib.h> #define N 100 #define C 10000 int n; int c; FILE *fin = NULL; FILE *fout = NULL; int startState[N+1]; int endState[N+1]; int pArr[2]; int result[8]; int sortRef[8] = {0, 1, 7, 2, 4, 5, 3, 6}; int rI = 0; int validate(int start[], int end[]) { for (int i = 1; i <= n; i++){ if (end[i] != -1 && end[i] != start[i]) return 0; } return 1; } void turn1(int state[], int n) { for (int i = 1; i <= n; i++) state[i] = !state[i]; } void turn2(int state[], int n) { for (int i = 1; i <= n; i+=2) state[i] = !state[i]; } void turn3(int state[], int n) { for (int i = 2; i <= n; i+=2) state[i] = !state[i]; } void turn4(int state[], int n) { for (int i = 1; i <= n; i+=3) state[i] = !state[i]; } void (*func[])(int state[], int n) = {0, turn1, turn2, turn3, turn4}; // 1,2 =3; 1,3 = 2; 2,3 =1; // 1 < 3,4 < 2 < 4 < 1,4 < 3 < 2,4 void handlePermute(int j){ int temp[N+1]; memcpy(temp, startState, sizeof(temp)); for (int m = 0; m < j; m++) { func[pArr[m]](temp, n); } if (validate(temp, endState)){ if (j == 1) { rI++; result[pArr[0]] = 1; } else { if (c%2 == 0){ if (pArr[0] == 1 && pArr[1] == 2){ result[3] = 1; } else if (pArr[0] == 1 && pArr[1] == 3) { result[2] = 1; } else if (pArr[0] == 2 && pArr[1] == 3) { result[1] = 1; } else { result[pArr[0]+pArr[1]] = 1; } rI++; } } } } void permute(int i, int j, int v){ if (i >= j) { handlePermute(j); } else { for (int m = 1; m <= v; m++){ if (i == 0 || (i > 0 && m > pArr[i-1])) { pArr[i] = m; permute(i+1, j, v); } } } } int main(){ fin = fopen("lamps.in", "r"); fout = fopen("lamps.out", "w"); fscanf(fin, "%d\n", &n); fscanf(fin, "%d\n", &c); for (int i = 1; i <= n; i++){ startState[i] = 1; endState[i] = -1; } int s; while (fscanf(fin, "%d", &s) && s != -1) { endState[s] = 1; } fscanf(fin, "\n"); while (fscanf(fin, "%d", &s) && s != -1) { endState[s] = 0; } if (c == 0) { if (validate(startState, endState)){ rI++; for (int i = 1; i <= n; i++){ fprintf(fout, "%d", startState[i]); } fprintf(fout, "\n"); } } else { permute(0, 1, 4); permute(0, 2, 4); } if (rI){ int temp[N+1]; for (int i = 1; i <= 7; i++){ int j = sortRef[i]; if (result[sortRef[i]]){ memcpy(temp, startState, sizeof(temp)); if (j <= 4) { func[j](temp, n); } else if (j == 5) { func[1](temp, n); func[4](temp, n); } else if (j == 6) { func[2](temp, n); func[4](temp, n); } else if (j == 7) { func[3](temp, n); func[4](temp, n); } for (int i = 1; i <= n; i++){ fprintf(fout, "%d", temp[i]); } fprintf(fout, "\n"); } } if (c != 0 && c%2 == 0) { if (validate(startState, endState)){ rI++; for (int i = 1; i <= n; i++){ fprintf(fout, "%d", startState[i]); } fprintf(fout, "\n"); } } } else { fprintf(fout, "%s\n", "IMPOSSIBLE"); }
return 0; } |
|