标签:
原题链接:http://acm.timus.ru/problem.aspx?space=1&num=1780
input | output |
---|---|
0?1 0?0 |
011 010 |
?00 ??0 |
Ambiguity |
100 100 |
Impossible
|
给你个格雷码和二进制,其中一些位置不确定,问你能不能相互转换,是否有多解。
就乱搞,顺着推一次,然后倒着推一次,最后如若还有问号则多解,如果推的过程中有矛盾,则无解。至于为啥要推两次,大家脑补脑补就知道了。
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #define MAX_N 100005 using namespace std; char k[MAX_N],x[MAX_N]; bool deal(char &a,char &b,char &c) { if (a == ‘?‘) { if (b == ‘0‘) { if (c != ‘?‘)a = c; return true; } else if (b == ‘1‘) { if (c != ‘?‘) a = ‘1‘ + ‘0‘ - c; return true; } } else if (a == ‘0‘) { if (b != c && b != ‘?‘ && c != ‘?‘)return false; if (b == ‘?‘)b = c; if (c == ‘?‘)c = b; return true; } else { if (b == c && b != ‘?‘)return false; if (b == ‘?‘ && c != ‘?‘)b = ‘1‘ + ‘0‘ - c; if (c == ‘?‘ && b != ‘?‘)c = ‘1‘ + ‘0‘ - b; return true; } } int main() { scanf("%s%s", k, x); bool now = 0; int n = strlen(k); for (int i = 0; i < n; i++) { char tmp = ‘0‘; bool flag = true; if (i == 0)flag = deal(tmp, k[i], x[i]); else flag = deal(k[i - 1], k[i], x[i]); if (!flag) { cout << "Impossible" << endl; return 0; } } for (int i = n - 1; i >= 0; i--) { char tmp = ‘0‘; bool flag = true; if (i == 0)flag = deal(tmp, k[i], x[i]); else flag = deal(k[i - 1], k[i], x[i]); if (!flag) { cout << "Impossible" << endl; return 0; } } bool flag = true; for (int i = 0; i < n; i++) if (x[i] == ‘?‘) { flag = false; break; } for (int i = 0; i < n; i++) if (k[i] == ‘?‘) { flag = false; break; } if (flag) printf("%s\n%s", k, x); else printf("Ambiguity\n"); return 0; }
标签:
原文地址:http://www.cnblogs.com/HarryGuo2012/p/4728184.html