Advertisement
Guest User

Untitled

a guest
Feb 25th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1. #include <fstream>
  2. #include <string>
  3. #include <cstring>
  4.  
  5. using namespace std;
  6.  
  7. ifstream fin ("x.in"); ofstream fout ("x.out");
  8.  
  9. const int nmax = 15;
  10. const int kmax = 70;
  11. int n, m, req;
  12. int mod;
  13.  
  14. string v[nmax + 1];
  15. string shp[nmax + 1];
  16. int d[ 2 ][nmax + 1][kmax + 1][(1 << nmax)];
  17.  
  18. void add (int &x, int y) {
  19.     x += y;
  20.     if (x >= mod)
  21.         x -= mod;
  22. }
  23.  
  24. int check (int x, int y, int a, int b) {
  25.     return v[ x ][ y ] == 'A' && v[ a ][ b ] == 'A';
  26. }
  27.  
  28. bool liber (int st, int j) {
  29.     return (st & (1 << (j - 1))) == 0;
  30. }
  31.  
  32. void flip () {
  33.     for (int i = 1; i <= m; ++ i) {
  34.         shp[ i ].resize(n + 1);
  35.         shp[ i ][ 0 ] = '#';
  36.     }
  37.  
  38.     for (int i = 1; i <= n; ++ i) {
  39.         for (int j = 1; j <= m; ++ j) {
  40.             shp[ j ][ i ] = v[ i ][ j ];
  41.         }
  42.     }
  43.  
  44.     swap(n, m);
  45.     for (int i = 1; i <= n; ++ i) {
  46.         for (int j = 1; j <= m; ++ j)
  47.             v[ i ][ j]  = shp[ i ][ j ];
  48.     }
  49. }
  50.  
  51. void solve () {
  52.     fin >> m >> n >> req >> mod;
  53.  
  54.     for (int i = 1; i <= n; ++ i) {
  55.         fin >> v[ i ];
  56.         v[ i ] = '#' + v[ i ];
  57.     }
  58.  
  59.     if (n < m) {
  60.         flip();
  61.     }
  62.  
  63.     memset(d, 0, sizeof(d));
  64.     d[ 0 ][ m ][ 0 ][ 0 ] = 1;
  65.  
  66.     int ind = 1;
  67.     for (int i = 1; i <= n; ++ i, ind = 1 - ind) {
  68.         memset(d[ ind ], 0, sizeof(d[ ind ]));
  69.  
  70.         for (int k = 0; k <= req; ++ k)
  71.             for (int st = 0; st < (1 << m); ++ st)
  72.                 d[ ind ][ 0 ][ k ][ st ] = d[1 - ind][ m ][ k ][ st ];
  73.  
  74.         for (int j = 1; j <= m; ++ j) {
  75.             for (int k = 0; k <= req; ++ k) {
  76.                 for (int st = 0; st < (1 << m); ++ st) {
  77.                     int aux = 0;
  78.  
  79.                     if (liber(st, j) && k >= check(i, j, i - 1, j)) { /// pun vertical
  80.                         add(aux, d[ ind ][j - 1][k - check(i, j, i - 1, j)][st ^ (1 << (j - 1))]);
  81.                     }
  82.  
  83.                     if (j - 2 >= 0 && liber(st, j) && liber(st, j - 1) && k >= check(i, j, i, j - 1)) { /// pun orizontal
  84.                         add(aux, d[ ind ][j - 2][k - check(i, j, i, j - 1)][ st ]);
  85.                     }
  86.  
  87.                     if (!liber(st, j)) {
  88.                         add(aux, d[ ind ][j - 1][ k ][st ^ (1 << (j - 1))]);
  89.                     }
  90.  
  91.                     d[ ind ][ j ][ k ][ st ] = aux;
  92.                 }
  93.             }
  94.         }
  95.     }
  96.  
  97.     fout << d[1 - ind][ m ][ req ][ 0 ] << "\n";
  98. }
  99.  
  100. int main () {
  101.     int t;
  102.  
  103.     fin >> t;
  104.  
  105.     while (t --) {
  106.         solve ();
  107.     }
  108.  
  109.     fin.close();
  110.     fout.close();
  111.     return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement