简单的位运算+一些特殊情况的判断:..
最最关键的地方其实是, 求出所有可能值之后, 先判断是否该值和无法确认好坏的段有交, 其次对每一个可能值计算最终显示值
如果全部一样, 那就是无歧义显示:..
我的代码复杂度是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