简单的位运算+一些特殊情况的判断:..
最最关键的地方其实是, 求出所有可能值之后, 先判断是否该值和无法确认好坏的段有交, 其次对每一个可能值计算最终显示值
如果全部一样, 那就是无歧义显示:..
我的代码复杂度是n
写出代码
..:
#include <bits/stdc++.h>
using namespace std;
struct res {
int w, g, x;
};
typedef vector<int> vi;
typedef vector<res> vr;
#define pb push_back
#define all(c) (c).begin(), (c).end()
int T;
int d[10]={126, 48, 109, 121, 51, 91, 95, 112, 127, 123};
int main(void) {
scanf("%d", &T);
for (int t=1; t<=T; t++) {
vi m[101];
vr r;
int n, g, x, c, f, l[101];
char w[8];
scanf("%d", &n);
for (int i=0; i<n; i++) {
c=0;
scanf("%s", w);
for (int j=6; j>=0; j--) if (w[j]=='1') c|=1<<(6-j);
for (int j=0; j<10; j++) if ((d[j]|c)==d[j]) m[i].pb(j);
l[i]=c;
}
for (int i=0; i<m[0].size(); i++) {
f=m[0][i];
g=(~l[0])&d[f];
x=l[0]&d[f];
c=(f+9)%10;
for (int j=1; j<n; j++, c=(c+9)%10) {
if (!binary_search(all(m[j]), c)) {
goto next;
} else {
g|=(~l[j])&d[c];
x|=l[j]&d[c];
}
}
for (int k=0; k<n; k++) if (g&l[k])
goto next;
r.pb((res){c, g, x});
next:;
}
if (r.size()) {
f=1;
for (int i=0; f && i<r.size(); i++) if (d[r[i].w]&(~(r[i].g|r[i].x)))
f=0;
if (f) {
c=d[r[0].w]&(~r[0].g)&r[0].x;
for (int i=1; f && i<r.size(); i++) if ((d[r[i].w]&(~r[i].g)&r[i].x)!=c)
f=0;
if (f) {
printf("Case #%d: ", t);
cout<<bitset<7>(c)<<endl;
} else {
printf("Case #%d: ERROR!\n", t);
}
} else {
printf("Case #%d: ERROR!\n", t);
}
} else {
printf("Case #%d: ERROR!\n", t);
}
}
}
No comments :
Post a Comment