Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <string>
- #include <cstring>
- using namespace std;
- ifstream fin ("x.in"); ofstream fout ("x.out");
- const int nmax = 15;
- const int kmax = 70;
- int n, m, req;
- int mod;
- string v[nmax + 1];
- string shp[nmax + 1];
- int d[ 2 ][nmax + 1][kmax + 1][(1 << nmax)];
- void add (int &x, int y) {
- x += y;
- if (x >= mod)
- x -= mod;
- }
- int check (int x, int y, int a, int b) {
- return v[ x ][ y ] == 'A' && v[ a ][ b ] == 'A';
- }
- bool liber (int st, int j) {
- return (st & (1 << (j - 1))) == 0;
- }
- void flip () {
- for (int i = 1; i <= m; ++ i) {
- shp[ i ].resize(n + 1);
- shp[ i ][ 0 ] = '#';
- }
- for (int i = 1; i <= n; ++ i) {
- for (int j = 1; j <= m; ++ j) {
- shp[ j ][ i ] = v[ i ][ j ];
- }
- }
- swap(n, m);
- for (int i = 1; i <= n; ++ i) {
- for (int j = 1; j <= m; ++ j)
- v[ i ][ j] = shp[ i ][ j ];
- }
- }
- void solve () {
- fin >> m >> n >> req >> mod;
- for (int i = 1; i <= n; ++ i) {
- fin >> v[ i ];
- v[ i ] = '#' + v[ i ];
- }
- if (n < m) {
- flip();
- }
- memset(d, 0, sizeof(d));
- d[ 0 ][ m ][ 0 ][ 0 ] = 1;
- int ind = 1;
- for (int i = 1; i <= n; ++ i, ind = 1 - ind) {
- memset(d[ ind ], 0, sizeof(d[ ind ]));
- for (int k = 0; k <= req; ++ k)
- for (int st = 0; st < (1 << m); ++ st)
- d[ ind ][ 0 ][ k ][ st ] = d[1 - ind][ m ][ k ][ st ];
- for (int j = 1; j <= m; ++ j) {
- for (int k = 0; k <= req; ++ k) {
- for (int st = 0; st < (1 << m); ++ st) {
- int aux = 0;
- if (liber(st, j) && k >= check(i, j, i - 1, j)) { /// pun vertical
- add(aux, d[ ind ][j - 1][k - check(i, j, i - 1, j)][st ^ (1 << (j - 1))]);
- }
- if (j - 2 >= 0 && liber(st, j) && liber(st, j - 1) && k >= check(i, j, i, j - 1)) { /// pun orizontal
- add(aux, d[ ind ][j - 2][k - check(i, j, i, j - 1)][ st ]);
- }
- if (!liber(st, j)) {
- add(aux, d[ ind ][j - 1][ k ][st ^ (1 << (j - 1))]);
- }
- d[ ind ][ j ][ k ][ st ] = aux;
- }
- }
- }
- }
- fout << d[1 - ind][ m ][ req ][ 0 ] << "\n";
- }
- int main () {
- int t;
- fin >> t;
- while (t --) {
- solve ();
- }
- fin.close();
- fout.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement