func_code_string: #include <bits/stdc++.h>   using namespace std;   char a[25][25];   int dp[40][1 << 20], n;   bool vis[40][1 << 20];   int f(int xx, int st) {     if (vis[xx][st]) return dp[xx][st];     int &res = dp[xx][st];     vis[xx][st] = true;     if (xx == n * 2 - 2) {       res = 0;     } else {       if (xx & 1)         res = -0x3f3f3f3f;       else         res = 0x3f3f3f3f;       int mask[30];       memset(mask, 0, sizeof(mask));       int cnt = 0;       for (int j = 0; j <= xx + 1; ++j) {         int x = xx + 1 - j;         int y = j;         if (x >= n || y >= n) continue;         mask[a[x][y] -  a ] |= (1 << cnt);         cnt++;       }       for (int i = 0; i < 26; ++i) {         if (mask[i]) {           int xt;           if (xx + 1 < n)             xt = (st | (st << 1)) & mask[i];           else             xt = (st | (st >> 1)) & mask[i];           if (xt == 0) continue;           int tmp = 0;           if (i == 0)             tmp = 1;           else if (i == 1)             tmp = -1;           if (xx & 1)             res = max(res, tmp + f(xx + 1, xt));           else             res = min(res, tmp + f(xx + 1, xt));         }       }     }     if (xx == 0) {       if (a[0][0] ==  a )         res += 1;       else if (a[0][0] ==  b )         res -= 1;     }     return res;   }   int main() {     while (~scanf( %d , &n)) {       for (int i = 0; i < n; ++i) scanf( %s , a[i]);       memset(vis, 0, sizeof(vis));       int res = f(0, 1);       if (res == 0)         printf( DRAW n );       else if (res > 0)         printf( FIRST n );       else         printf( SECOND n );     }     return 0;   }   