Advertisement
Guest User

astein

a guest
Mar 3rd, 2012
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.40 KB | None | 0 0
  1. #include <cstdio>
  2. #include <vector>
  3. #include <string>
  4. #include <map>
  5. #include <cstring>
  6.  
  7. using namespace std;
  8.  
  9. char a[115][115];
  10. int totcnt;
  11. int K;
  12. int ret;
  13.  
  14. int dx[4] = {0, 1, 1, 1};
  15. int dy[4] = {1, -1, 0, 1};
  16. int s4, s3, s2;
  17. int n, m;
  18.  
  19. map<pair<int, string>, double> pmap;
  20. string S;
  21. int KK;
  22.  
  23. void go(int k) {
  24.     if (k == S.size()) {
  25.         totcnt++;
  26.         char mid = S[S.size() / 2];
  27.         if (S.find(string(S.size() / 2 + 1, mid)) != string::npos) {
  28.             ret++;
  29.         }
  30.         return;
  31.     }
  32.     if (S[k] == '?') {
  33.         for (int i = 1; i <= KK; ++i) {
  34.             S[k] = '0' + i;
  35.             go(k + 1);
  36.             S[k] = '?';
  37.         }
  38.     } else {
  39.         go(k + 1);
  40.     }
  41. }
  42.  
  43. void pcalc(int K, string s) {
  44.     if (pmap.count(make_pair(K, s)) > 0) return;
  45.     S = s;
  46.     KK = K;
  47.     totcnt = 0;
  48.     ret = 0;
  49.     go(0);
  50.     pmap[make_pair(K, s)] = ret * 1.0 / totcnt;
  51. }
  52.  
  53. int main() {
  54.     int T;
  55.     scanf("%d", &T);
  56.     for (int cn = 1; cn <= T; ++cn) {
  57.         totcnt = 0;
  58.         int k;
  59.         scanf("%d%d%d%d%d%d", &n, &m, &k, &s4, &s3, &s2);
  60.         K = k;
  61.         ret = 0;
  62.         memset(a, 0, sizeof(a));
  63.         for (int i = 0; i < n + 6; ++i)
  64.             for (int j = 0; j < m + 6; ++j)
  65.                 a[i][j] = '0';
  66.         for (int i = 0; i < n; ++i)
  67.             for (int j = 0; j < m; ++j) {
  68.                 scanf(" %c", &a[i + 3][j + 3]);
  69.             }
  70.         n += 6, m += 6;
  71.         for (int i = 3; i < n - 3; ++i) {
  72.             for (int j = 3; j < m - 3; ++j) {
  73.                 for (int k = 0; k < 4; ++k) {
  74.                     string s = "";
  75.                     for (int l = -3; l <= 3; ++l) {
  76.                         s += a[i + l * dx[k]][j + l * dy[k]];
  77.                     }
  78.                     char mid = a[i][j];
  79.                     if (mid == '?') {
  80.                         string s1 = s, s2 = s.substr(1, 5), s3 = s.substr(2, 3);
  81.                         for (int l = 1; l <= K; ++l) {
  82.                             s1[3] = '0' + l;
  83.                             s2[2] = '0' + l;
  84.                             s3[1] = '0' + l;
  85.                             pcalc(K, s1);
  86.                             pcalc(K, s2);
  87.                             pcalc(K, s3);
  88.                         }
  89.                     } else {
  90.                         pcalc(K, s);
  91.                         pcalc(K, s.substr(1, 5));
  92.                         pcalc(K, s.substr(2, 3));
  93.                     }
  94.                 }
  95.             }
  96.         }
  97.  
  98.         ret = 0;
  99.         double sol = 0.0;
  100.         for (int i = 3; i < n - 3; ++i) {
  101.             for (int j = 3; j < m - 3; ++j) {
  102.                 string s[4];
  103.                 char mid = a[i][j];
  104.                 for (int k = 0; k < 4; ++k) {
  105.                     s[k] = "";
  106.                     for (int l = -3; l <= 3; ++l) {
  107.                         s[k] += a[i + l * dx[k]][j + l * dy[k]];
  108.                     }
  109.                 }
  110.                 if (mid == '?') {
  111.                     double rr = 0, r4 = 0, r3 = 0, r2 = 0;
  112.                     for (int k = 1; k <= K; ++k) {
  113.                         s[0][3] = s[1][3] = s[2][3] = s[3][3] = '0' + k;
  114.                         double p4s1 = pmap[make_pair(K, s[0])];
  115.                         double p4s2 = pmap[make_pair(K, s[1])];
  116.                         double p4s3 = pmap[make_pair(K, s[2])];
  117.                         double p4s4 = pmap[make_pair(K, s[3])];
  118.                         double p4 = 1.0 - (1.0 - p4s1) * (1.0 - p4s2) * (1.0 - p4s3) * (1.0 - p4s4);
  119.                         double p3s1 = pmap[make_pair(K, s[0].substr(1, 5))];
  120.                         double p3s2 = pmap[make_pair(K, s[1].substr(1, 5))];
  121.                         double p3s3 = pmap[make_pair(K, s[2].substr(1, 5))];
  122.                         double p3s4 = pmap[make_pair(K, s[3].substr(1, 5))];
  123.                         double p3 = 1.0 - (1.0 - p3s1) * (1.0 - p3s2) * (1.0 - p3s3) * (1.0 - p3s4) - p4;
  124.                         double p2s1 = pmap[make_pair(K, s[0].substr(2, 3))];
  125.                         double p2s2 = pmap[make_pair(K, s[1].substr(2, 3))];
  126.                         double p2s3 = pmap[make_pair(K, s[2].substr(2, 3))];
  127.                         double p2s4 = pmap[make_pair(K, s[3].substr(2, 3))];
  128.                         double p2 = 1.0 - (1.0 - p2s1) * (1.0 - p2s2) * (1.0 - p2s3) * (1.0 - p2s4) - p4 - p3;
  129.                         s[0][3] = s[1][3] = s[2][3] = s[3][3] = '?';
  130.                         r4 += p4 / K;
  131.                         r3 += p3 / K;
  132.                         r2 += p2 / K;
  133.                     }
  134.                     sol += r4 * s4 + r3 * s3 + r2 * s2;
  135.                 } else {
  136.                     double p4s1 = pmap[make_pair(K, s[0])];
  137.                     double p4s2 = pmap[make_pair(K, s[1])];
  138.                     double p4s3 = pmap[make_pair(K, s[2])];
  139.                     double p4s4 = pmap[make_pair(K, s[3])];
  140.                     double p4 = 1.0 - (1.0 - p4s1) * (1.0 - p4s2) * (1.0 - p4s3) * (1.0 - p4s4);
  141.                     double p3s1 = pmap[make_pair(K, s[0].substr(1, 5))];
  142.                     double p3s2 = pmap[make_pair(K, s[1].substr(1, 5))];
  143.                     double p3s3 = pmap[make_pair(K, s[2].substr(1, 5))];
  144.                     double p3s4 = pmap[make_pair(K, s[3].substr(1, 5))];
  145.                     double p3 = 1.0 - (1.0 - p3s1) * (1.0 - p3s2) * (1.0 - p3s3) * (1.0 - p3s4) - p4;
  146.                     double p2s1 = pmap[make_pair(K, s[0].substr(2, 3))];
  147.                     double p2s2 = pmap[make_pair(K, s[1].substr(2, 3))];
  148.                     double p2s3 = pmap[make_pair(K, s[2].substr(2, 3))];
  149.                     double p2s4 = pmap[make_pair(K, s[3].substr(2, 3))];
  150.                     double p2 = 1.0 - (1.0 - p2s1) * (1.0 - p2s2) * (1.0 - p2s3) * (1.0 - p2s4) - p4 - p3;
  151.                     sol += p4 * s4 + p3 * s3 + p2 * s2;
  152.                 }
  153.             }
  154.         }
  155.         printf("Case #%d: %.7lf\n", cn, sol);
  156.     }
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement