func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 1 << 16;   int n, m;   int d[2][N];   int get_n(int x, int n) {     int tmp = 3 << (n * 2);     tmp = x & tmp;     tmp >>= n * 2;     return tmp;   }   int set_n(int x, int n, int y) {     int tmp = 3 << (n * 2);     x = x & (~tmp);     y <<= (n * 2);     x |= y;     return x;   }   void update(int &x, int y) {     if (x == -1 || x < y) x = y;   }   int solve() {     int i, j, k;     int t = 0;     memset(d, -1, sizeof(d));     d[0][0] = 0;     int tot = 1 << (n * 2 + 2);     for (i = 0; i < m; ++i) {       for (j = 0; j < n; ++j) {         memset(d[1 - t], -1, sizeof(d[1 - t]));         for (k = 0; k < tot; ++k) {           if (d[t][k] == -1) continue;           int t0 = get_n(k, j);           int t1 = get_n(k, j + 1);           int st = set_n(k, j, 1);           st = set_n(st, j + 1, 1);           update(d[1 - t][st], d[t][k]);           if (t0 > 0) {             st = set_n(k, j - 1, 2);             st = set_n(st, j, 0);             st = set_n(st, j + 1, 0);             update(d[1 - t][st], d[t][k] + 1);             if (t0 == 1) {               st = set_n(k, j - 1, 0);               st = set_n(st, j, 2);               st = set_n(st, j + 1, 2);               update(d[1 - t][st], d[t][k] + 1);             }           }           if (t1 > 0) {             st = set_n(k, j, 0);             st = set_n(st, j + 1, 0);             update(d[1 - t][st], d[t][k] + 1);             if (t1 == 1) {               st = set_n(k, j, 2);               st = set_n(st, j + 1, 2);               update(d[1 - t][st], d[t][k] + 1);             }           }           if (t0 == 1 && t1 == 1) {             st = set_n(k, j - 1, 0);             st = set_n(st, j, 2);             st = set_n(st, j + 1, 2);             update(d[1 - t][st], d[t][k] + 2);           }         }         t = 1 - t;       }       memset(d[1 - t], -1, sizeof(d[1 - t]));       for (k = 0; k < tot; ++k) {         int st = set_n(k, n, 0);         st <<= 2;         update(d[1 - t][st], d[t][k]);       }       t = 1 - t;     }     int ans = -1;     for (k = 0; k < tot; ++k) {       update(ans, d[t][k]);     }     return ans;   }   int main() {     int i, j, k, t, nc = 0;     while (scanf( %d%d , &n, &m) != EOF) {       if (n > m) swap(n, m);       int ans = solve();       printf( %d n , ans);     }     return 0;   }   