提交时间:2024-03-17 11:49:32

运行 ID: 138588

#include <algorithm> #include <cstdio> #include <cstring> using namespace std; int n, c, b[7]; bool bk; // 有没有解 const int a[8][7] = // 八种状况 {0, 0, 0, 0, 0, 0, 0, // 按钮1 或 按钮2,3 1, 0, 0, 1, 1, 1, 0, // 6=3+4 按钮3,4 2, 0, 1, 0, 1, 0, 1, // 2 按钮2 或 按钮1,3 3, 0, 1, 1, 0, 1, 1, // 4 按钮4 4, 1, 0, 0, 1, 0, 0, // 5=1+4 按钮1,4 5, 1, 0, 1, 0, 1, 0, // 3 按钮3 或 按钮1,2 6, 1, 1, 0, 0, 0, 1, // 7=2+4 按钮2,4 7, 1, 1, 1, 1, 1, 1}; // 0 不按 或 按钮x 2次相同 void pd(int k) { for (int i = 1; i <= 6; i++) if (b[i] != -1 && a[k][i] != b[i]) return; // 如果有要求却不合就不成立 for (int i = 1; i <= n; i++) printf("%d", a[k][(i - 1) % 6 + 1]); // 循环输出 printf("\n"); bk = 1; // 解记号 } int main() { scanf("%d%d", &n, &c); int t; memset(b, -1, sizeof(b)); // 初始化灯都没要求 while (scanf("%d", &t) != EOF) { if (t == -1) break; b[(t - 1) % 6 + 1] = 1; } // 将第几盏转换成六位中的位置 while (scanf("%d", &t) != EOF) { if (t == -1) break; b[(t - 1) % 6 + 1] = 0; } if (!c) { pd(7); if (bk) return 0; } // 有解就结束程序 else if (c == 1) { pd(0);//哪种实际的最终态 pd(2); pd(3); pd(5); if (bk) return 0; } else if (c == 2) { pd(0); pd(1); pd(2); pd(4); pd(5); pd(6); pd(7); if (bk) return 0; } else // 正常情况 { for (int i = 0; i < 8; i++) { pd(i); } // 8种判断 if (bk) return 0; } printf("IMPOSSIBLE\n"); // 无解 return 0; }