这道题里有四个按钮,分别为1234,按钮按两次以上是无效的,因此每个按钮只有按和不按。另外按钮存在如下等式: 1+2=3 1+3=2 2+3=1 1+2+3=0 因此最终只会留下八种状态,将最终的八种状态按二进制顺序排列并枚举这八种状态判断即可。 先做出最终的状态,然后不断“改变复原”直到按钮次数变为c次。 注意只按4和都不按的两种情况,当c为2时是无法“改变复原”的。
#include <cstdio> const int maxn = 100 + 5; int lamp[maxn]; int on[3]; int off[3]; int n, c; bool ok; void button(int id) { if (id == 1) { for (int i = 1; i <= n; i++) { lamp[i] = !lamp[i]; } } else if (id == 2) { for (int i = 1; i <= n; i += 2) { lamp[i] = !lamp[i]; } } else if (id == 3) { for (int i = 2; i <= n; i += 2) { lamp[i] = !lamp[i]; } } else { for (int k = 0; 3 * k + 1 <= n; k++) { lamp[3*k+1] = !lamp[3*k+1]; } } } void state(int id) { if (id == 1) { if (c >= 1) { ok = true; button(1); } } else if (id == 2) { if (c >= 2) { ok = true; button(3); button(4); } } else if (id == 3) { if (c >= 1) { ok = true; button(2); } } else if (id == 4) { if (c >= 1 && c - 1 != 1) { ok = true; button(4); } } else if (id == 5) { if (c >= 2) { ok = true; button(1); button(4); } } else if (id == 6) { if (c >= 1) { ok = true; button(3); } } else if (id == 7) { if (c >= 2) { ok = true; button(2); button(4); } } else { if (c != 1) { ok = true; } } } int main(int argc, char const *argv[]) { scanf("%d%d", &n, &c); for (int i = 0; i < 3; i++) { int tmp; scanf("%d", &tmp); if (tmp == -1) { break; } on[i] = tmp; } for (int i = 0; i < 3; i++) { int tmp; scanf("%d", &tmp); if (tmp == -1) { break; } off[i] = tmp; } for (int i = 1; i <= 8; i++) { for (int j = 1; j <= n; j++) { lamp[j] = 1; } ok = false; state(i); if (ok) { for (int j = 0; j < 3; j++) { if (on[j]) { if (lamp[on[j]] != 1) { ok = false; } } if (off[j]) { if (lamp[off[j]] != 0) { ok = false; } } } if (ok) { for (int j = 1; j <= n; j++) { printf("%d", lamp[j]); } putchar('\n'); } } } return 0; }