Unknown Switches 模拟

                        Unknown Switches

题目抽象:每个开关可能控制多个灯,每个灯只能被一个开关控制,给出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 }

 

转载于:https://www.cnblogs.com/hutaishi/p/4734743.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值