题目抽象:每个开关可能控制多个灯,每个灯只能被一个开关控制,给出Q的操作的开关变化,和灯的变化情况。求每个灯被那个开关控制。
分析:用flag[MS]表示开关i的开关情况,link[MS][40]表示灯i和开关j的控制关系。
模拟,对于每个操作的开关i和灯j,如果他们状态相同,那么他们可能存在控制关系,如果状态不同,那么一定不存在控制关系。
最后统计每个灯被多少个开关控制,如果是1,那么可以确定被哪个开关控制,否则,信息不足,不能确定控制关系,输入‘?’。
1 /******************************** 2 please don‘t hack me!! /(ToT)/~~ 3 __------__ 4 /~ ~ 5 | //^\\//^\| 6 /~~\ || T| |T|:~ 7 | |6 ||___|_|_||:| 8 \__. / o \/‘ 9 | ( O ) 10 /~~~~\ `\ \ / 11 | |~~\ | ) ~------~` 12 /‘ | | | / ____ /~~~) 13 (_/‘ | | | /‘ | ( | 14 | | | \ / __)/ 15 \ \ \ \/ /‘ \ ` 16 \ \|\ / | |\___| 17 \ | \____/ | | 18 /^~> \ _/ < 19 | | \ 20 | | \ \ 21 -^-\ \ | ) 22 `\_______/^\______/ 23 ************************************/ 24 25 #include <iostream> 26 #include <cstdio> 27 #include <cstring> 28 #include <cmath> 29 #include <algorithm> 30 #include <string> 31 #include <vector> 32 #include <set> 33 #include <map> 34 #include <queue> 35 #include <stack> 36 #include <cstdlib> 37 #include <sstream> 38 using namespace std; 39 typedef long long LL; 40 const LL INF = 0x5fffffff; 41 const double EXP = 0x5fffffff; 42 const LL MOD = (LL)1E9+7; 43 const int MS = 1005; 44 45 int link[MS][40]; //灯i与开关j是否存在控制关系。1表示存在,2表示一定不存在 46 bool flag[MS]; // 灯i的状态。 47 char S[MS]; 48 char B[MS]; 49 int n,m,q; 50 51 int main() { 52 while(scanf("%d%d%d",&n,&m,&q) == 3 && (n + m + q)) { 53 memset(link,0,sizeof(link)); 54 memset(flag,0,sizeof(flag)); 55 if (!q) { 56 if (n == 1) { 57 for (int i = 0; i < m;i++) 58 printf("0"); 59 printf("\n"); 60 } 61 else { 62 for (int i = 0; i < m; i++) { 63 printf("?"); 64 } 65 printf("\n"); 66 } 67 continue; 68 } 69 while (q--) { 70 scanf("%s%s",S,B); 71 for (int i = 0; i < n; i++) { 72 if (S[i] == ‘1‘){ 73 if (flag[i]) 74 flag[i] = 0; 75 else 76 flag[i] = 1; 77 } 78 } 79 for (int i = 0; i < n; i++){ 80 for (int j = 0;j < m;j++) { 81 if (flag[i] && B[j] == ‘1‘ && link[j][i] != 2) 82 link[j][i] = 1; 83 else if(flag[i] == 0 && B[j] == ‘0‘ && link[j][i] != 2) 84 link[j][i] = 1; 85 else 86 link[j][i] = 2; // 一定不存在控制关系。 87 } 88 } 89 } 90 for (int i = 0; i < m; i++) { 91 int cnt = 0; 92 int index = 0; 93 for (int j = 0; j < n; j++) { 94 if(link[i][j] == 1) { 95 cnt++; 96 index = j; 97 } 98 } 99 if(cnt == 1) { 100 if (index < 10) 101 printf("%d",index); 102 else 103 printf("%c",index - 10 + ‘A‘); 104 } 105 else 106 printf("?"); 107 } 108 printf("\n"); 109 } 110 return 0; 111 }
时间: 2024-10-25 07:41:28