func_code_string: #include <bits/stdc++.h>   using namespace std;   const int inf = 0x3f3f3f3f;   int ma[10][10];   bool vis[20];   int isok[20][20], tmp[20][20];   int n, m, ok = 0;   int dx[] = {1, 0, -1, 0};   int dy[] = {0, 1, 0, -1};   void solve() {     puts( YES );     if (n > 4) {       for (int i = 1; i <= m; i++) {         if (i % 2) {           for (int j = 1; j <= n; j += 2) printf( %d  , (i - 1) * n + j);           for (int j = 2; j <= n; j += 2) printf( %d  , (i - 1) * n + j);         } else {           for (int j = 2; j <= n; j += 2) printf( %d  , (i - 1) * n + j);           for (int j = 1; j <= n; j += 2) printf( %d  , (i - 1) * n + j);         }         puts(  );       }     } else {       int s1 = 1;       int s2 = 2;       for (int i = 1; i <= m; i++) {         for (int j = 1; j <= n; j++) {           if (j % 2) {             if (s1 > m) s1 = 2;             printf( %d  , (s1 - 1) * n + j);           } else {             if (s2 > m) s2 = 1;             printf( %d  , (s2 - 1) * n + j);           }         }         s1 += 2;         s2 += 2;         puts(  );       }     }   }   void init() {     for (int i = 1; i < (m + 1); ++i)       for (int j = 1; j < (n + 1); ++j) tmp[i][j] = (i - 1) * n + j;     for (int i = 1; i < (n * m + 1); ++i)       for (int j = 1; j < (m * n + 1); ++j) isok[i][j] = 1;     for (int i = 1; i < (m + 1); ++i)       for (int j = 1; j < (n + 1); ++j) {         for (int k = 0; k < (4); ++k) {           int xx = i + dx[k];           int yy = j + dy[k];           if (xx < 1 || xx > m || yy < 1 || yy > n)             continue;           else             isok[tmp[xx][yy]][tmp[i][j]] = isok[tmp[i][j]][tmp[xx][yy]] = 0;         }       }   }   void dfs(int dep) {     if (dep == n * m || ok) {       ok = 1;       return;     } else {       for (int i = 1; i < (n * m + 1); ++i) {         int flag = 1;         if (vis[i])           continue;         else {           int flag = 1;           ++dep;           int row = (dep - 1) / n + 1;           int col = (dep - 1) % n + 1;           if (row > 1) {             int nxt1 = ma[row - 1][col];             if (!isok[nxt1][i]) flag = 0;           }           if (col > 1) {             int nxt2 = ma[row][col - 1];             if (!isok[nxt2][i]) flag = 0;           }           if (flag == 0) {             dep--;             continue;           }           ma[row][col] = i;           vis[i] = 1;           dfs(dep);           if (ok) return;           ma[row][col] = 0;           vis[i] = 0;           --dep;         }       }     }   }   int main() {     scanf( %d%d , &m, &n);     if (max(n, m) > 4)       solve();     else {       init();       for (int i = 1; i < (n * m + 1); ++i)         if (!ok) {           memset(vis, 0, sizeof(vis));           memset(ma, 0, sizeof(ma));           vis[i] = 1;           ma[1][1] = i;           dfs(1);         }       if (!ok)         printf( NO );       else {         puts( YES );         for (int i = 1; i < (m + 1); ++i) {           for (int j = 1; j < (n + 1); ++j) printf( %d  , ma[i][j]);           puts(  );         }       }     }     return 0;   }   