Problem: Example

Input

2 2
..
..


Output

Second

Solution (in CPP):

Solution:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int h,w;
string s[30];
int dp[30][30][30][30];
int grundy(int sy,int sx,int ty,int tx){
  if(~dp[sy][sx][ty][tx]) return dp[sy][sx][ty][tx];
  set<int> g;
  for(int i=sy;i<ty;i++){
    for(int j=sx;j<tx;j++){
      if(s[i][j]=='X') continue;
      int k=0;
      k^=grundy(sy,sx,i,j);
      k^=grundy(i+1,j+1,ty,tx);
      k^=grundy(sy,j+1,i,tx);
      k^=grundy(i+1,sx,ty,j);
      g.insert(k);
    }
  }
  int r=0;
  while(g.count(r)) r++;
  return dp[sy][sx][ty][tx]=r;
}
signed main(){
  cin>>h>>w;
  for(int i=0;i<h;i++) cin>>s[i];
  memset(dp,-1,sizeof(dp));
  cout<<(grundy(0,0,h,w)?"First":"Second")<<endl;
  return 0;
}