Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #define P (1ul << 0)
- #define Q (1ul << 1)
- #define R (1ul << 2)
- #define S (1ul << 3)
- #define T (1ul << 4)
- #define NAMES "PQRST"
- int
- main(void)
- {
- int nsuspects = 5;
- int counts[] = {1, 1, 3, 1, 1};
- unsigned long rules[] = {
- S|T, 0,
- R|P, P,
- T|S, T|S, 0, S,
- P|Q, Q,
- P|Q, P
- };
- for (unsigned long s = 0; s < (1ul << nsuspects); s++) {
- unsigned long *p = rules;
- int valid = 1;
- for (int i = 0; i < nsuspects; i++) {
- int guilty = (s >> i) & 1;
- int correct = 0;
- unsigned long care = *p++;
- for (int j = 0; j < counts[i]; j++) {
- unsigned long claim = *p++;
- if ((claim & care) == (s & care))
- correct = 1;
- }
- if ((correct && guilty) || (!correct && !guilty))
- valid = 0;
- }
- /* Print solution */
- if (valid) {
- for (int i = 0; i < nsuspects; i++)
- if ((s >> i) & 1)
- putchar(NAMES[i]);
- putchar('\n');
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement