Ranking (as of 2013-09-14): 312 out of 754
Language: C++
/* UVa 416 - LED Test To build using Visual Studio 2012: cl -EHsc -O2 UVa_416_LED_Test.cpp */ #include <cstdio> const unsigned char leds[] = {0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b}; const int n_max = sizeof(leds); unsigned char s_to_sequence(const char* s) { unsigned char sq = 0, b = 0x40; do { if (*s++ == 'Y') sq |= b; b >>= 1; } while (b); return sq; } bool match_sequence(int n, unsigned char sequence[]) { for (int ns = n_max; ns >= n; ns--) { bool match = true; unsigned char not_burned = 0x7f; for (int i = 1; i <= n; i++) { unsigned char led = leds[ns - i]; led &= not_burned; unsigned char diff = led ^ sequence[i - 1]; unsigned char db = diff, lb = led; for ( ; db; db >>= 1, lb >>= 1) if (db & 1 && !(lb & 1)) break; // no burned-out segments will recover if (db) { match = false; break; } not_burned &= ~diff; } if (match) return true; } return false; } int main() { while (true) { int n; scanf("%d", &n); if (!n) break; unsigned char sequence[n_max]; for (int i = 0; i < n; i++) { char s[7 + 1]; scanf("%s", s); sequence[i] = s_to_sequence(s); } if (match_sequence(n, sequence)) puts("MATCH"); else puts("MISMATCH"); } return 0; }
No comments:
Post a Comment