func_code_string: #include <bits/stdc++.h>   using namespace std;   int N;   string board[30];   int mask[42][30];   int dp[42][1 << 20];   int func(int i, int j, int c, bool first) {     if (dp[i][j] != 10000) return dp[i][j];     int next;     int ans = -(1 << 29);     if (i == 2 * (N - 1)) {       ans = 0;     } else {       for ((next) = 0; (next) < (int)(26); (next)++) {         int i2 = i + 1;         int j2 = (mask[i + 1][next] & (j | (j << 1)));         if (j2 != 0) ans = max(ans, -func(i2, j2, next, !first));       }     }     if (first) {       if (c == 0)         ans++;       else if (c == 1)         ans--;     } else {       if (c == 0)         ans--;       else if (c == 1)         ans++;     }     return dp[i][j] = ans;   }   string calc() {     int i, j, k;     for ((i) = 0; (i) < (int)(2 * N); (i)++)       for ((j) = 0; (j) < (int)(26); (j)++)         for ((k) = 0; (k) < (int)(N); (k)++) {           int x = k;           int y = i - x;           if (y >= 0 && y < N && board[x][y] -  a  == j) mask[i][j] |= (1 << k);         }     for ((i) = 0; (i) < (int)(2 * N); (i)++)       for ((j) = 0; (j) < (int)((1 << N)); (j)++) dp[i][j] = 10000;     int ans = func(0, 1, board[0][0] -  a , false);     if (ans < 0) return  FIRST ;     if (ans > 0) return  SECOND ;     return  DRAW ;   }   void solve(istream &in, ostream &out) {     in >> N;     for (int i = 0; i < N; i++) in >> board[i];     out << calc() << endl;   }   int main() {     solve(cin, cout);     return 0;   }   