您的位置:首页 > 其它

Unknown Switches 模拟

2015-08-16 18:36 260 查看
                        Unknown Switches

题目抽象:每个开关可能控制多个灯,每个灯只能被一个开关控制,给出Q的操作的开关变化,和灯的变化情况。求每个灯被那个开关控制。

分析:用flag[MS]表示开关i的开关情况,link[MS][40]表示灯i和开关j的控制关系。

模拟,对于每个操作的开关i和灯j,如果他们状态相同,那么他们可能存在控制关系,如果状态不同,那么一定不存在控制关系。

最后统计每个灯被多少个开关控制,如果是1,那么可以确定被哪个开关控制,否则,信息不足,不能确定控制关系,输入‘?’。

/********************************
please don't hack me!! /(ToT)/~~
__------__
/~          ~\
|    //^\\//^\|
/~~\  ||  T| |T|:~\
| |6   ||___|_|_||:|
\__.  /      o  \/'
|   (       O   )
/~~~~\    `\  \         /
| |~~\ |     )  ~------~`\
/' |  | |   /     ____ /~~~)\
(_/'   | | |     /'    |    ( |
| | |     \    /   __)/ \
\  \ \      \/    /' \   `\
\  \|\        /   | |\___|
\ |  \____/     | |
/^~>  \        _/ <
|  |         \       \
|  | \        \        \
-^-\  \       |        )
`\_______/^\______/
************************************/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <cstdlib>
#include <sstream>
using namespace std;
typedef long long LL;
const LL INF = 0x5fffffff;
const double EXP = 0x5fffffff;
const LL MOD = (LL)1E9+7;
const int MS = 1005;

int link[MS][40];       //灯i与开关j是否存在控制关系。1表示存在,2表示一定不存在
bool flag[MS];          //  灯i的状态。
char S[MS];
char B[MS];
int n,m,q;

int main() {
while(scanf("%d%d%d",&n,&m,&q) == 3 && (n + m + q)) {
memset(link,0,sizeof(link));
memset(flag,0,sizeof(flag));
if (!q) {
if (n == 1) {
for (int i = 0; i < m;i++)
printf("0");
printf("\n");
}
else {
for (int i = 0; i < m; i++) {
printf("?");
}
printf("\n");
}
continue;
}
while (q--) {
scanf("%s%s",S,B);
for (int i = 0; i < n; i++) {
if (S[i] == '1'){
if (flag[i])
flag[i] = 0;
else
flag[i] = 1;
}
}
for (int i = 0; i < n; i++){
for (int j = 0;j < m;j++) {
if (flag[i] && B[j] == '1' && link[j][i] != 2)
link[j][i] = 1;
else if(flag[i] == 0 && B[j] == '0' && link[j][i] != 2)
link[j][i] = 1;
else
link[j][i] = 2; // 一定不存在控制关系。
}
}
}
for (int i = 0; i < m; i++) {
int cnt = 0;
int index = 0;
for (int j = 0; j < n; j++) {
if(link[i][j] == 1) {
cnt++;
index = j;
}
}
if(cnt == 1) {
if (index < 10)
printf("%d",index);
else
printf("%c",index - 10 + 'A');
}
else
printf("?");
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: