uva 296 - Safebreaker

枚举法

 1 #include <cstdio>
 2 using namespace std;
 3 
 4 int main()
 5 {
 6     int t, n, i, j, k;
 7     scanf("%d", &t);
 8     char f[10000][5];
 9     for(i = 0; i <= 9999; i++)
10         sprintf(f[i], "%04d", i);
11 
12     while(t--)
13     {
14         scanf("%d", &n);
15         char G[100][5], A[100], B[100];
16         for(i = 0; i < n; i++)
17             scanf("%s %d/%d", G[i], &A[i], &B[i]);
18 
19         int cnt = 0, ans;
20         char s[5];
21         for(i = 0; i <= 9999; i++)
22         {
23             s[0] = f[i][0];
24             s[1] = f[i][1];
25             s[2] = f[i][2];
26             s[3] = f[i][3];
27             for(j = 0; j < n; j++)
28             {
29                 int num[10] = {}, a = 0, b = 0;
30 
31                 for(k = 0; k < 4; k++)
32                     num[G[j][k] - '0'] ++;
33 
34                 for(k = 0; k < 4; k++)
35                     if(num[s[k]-'0'] > 0)
36                         b++, num[s[k]-'0']--;
37 
38                 for(k = 0; k < 4; k++)
39                     if(s[k] == G[j][k])
40                         a++, b--;
41 
42                 if(A[j] == a && B[j] == b) continue;
43                 else break;
44             }
45             if(j == n)
46             {
47                 cnt ++;
48                 ans = i;
49                 if(cnt == 2)
50                     break;
51             }
52         }
53         if(cnt == 1) printf("%04d\n", ans);
54         else if(cnt == 0) puts("impossible");
55         else puts("indeterminate");
56     }
57     return 0;
58 }

 

 1 #include <iostream>
 2 #include <set>
 3 #include <stdio.h>
 4  
 5 using namespace std;
 6 struct Combination {
 7 int num[4];
 8 int taken[4];
 9 Combination(int N) {
10 for (size_t i = 0; i < 4; i++)
11 num[i] = N % 10, N /= 10, taken[i] = 0;
12 }
13 int matches(Combination & o) {
14 int count = 0;
15 for (size_t i = 0; i < 4; i++) {
16 if (this->num[i] == o.num[i]) {
17 count++;
18 taken[i] = o.taken[i] = 1;
19 }
20 }
21 return count;
22 }
23 int contains(Combination & o) {
24 int count = 0;
25 for (int i = 0; i < 4; i++) {
26 if (taken[i])
27 continue;
28 for (int j = 0; j < 4; j++) {
29 if (o.taken[j])
30 continue;
31 if (o.num[j] == num[i]) {
32 count++;
33 taken[i] = o.taken[j] = 1;
34 }
35 }
36 }
37 return count;
38 }
39 };
40 struct Guess {
41 int n, r, w;
42 Combination com;
43 Guess() :
44 r(0), w(0), com(Combination(0)) {
45 }
46 ;
47 Guess(int N, int R, int W) :
48 n(N), r(R), w(W), com(Combination(N)) {
49 }
50 bool apply(Combination& c) {
51 int m = com.matches(c), co = com.contains(c);
52 return m == r && co == w;
53 }
54 void reset() {
55 com = Combination(n);
56 }
57 };
58 int main(void) {
59 int T, g, N, R, W;
60  
61 scanf("%d", &T);
62 while (T--) {
63 scanf("%d", &g);
64 Guess guesses[g];
65 for (size_t i = 0; i < g; i++) {
66 scanf("%d %d/%d", &N, &R, &W);
67 guesses[i] = Guess(N, R, W);
68 }
69 int matches = 0;
70 Combination match(0);
71 for (int n = 0; n < 10000; n++) {
72 for (size_t i = 0; i < g; i++) {
73 guesses[i].reset();
74 }
75 bool applyToAll = true;
76  
77 Combination abc = Combination(n);
78  
79 if (abc.valid())
80 for (size_t i = 0; i < g; i++) {
81 Combination ab = Combination(n);
82 applyToAll &= guesses[i].apply(ab);
83 }
84  
85 if (applyToAll) {
86 matches++;
87 match = Combination(n);
88 }
89 }
90 if (!matches)
91 printf("impossible\n");
92 else if (matches == 1)
93 printf("%d%d%d%d\n", match.num[3], match.num[2], match.num[1], match.num[0]);
94 else if (matches > 1)
95 printf("indeterminate\n");
96 }
97 return 0;
98 }

 

posted @ 2016-01-19 23:15  小小泽  阅读(172)  评论(0编辑  收藏  举报