#include using namespace std; using ll = long long; using ld = long double; using vll = vector; using pll = pair; #define rep(i,n) for(int i=0;i<(n);i++) #define rrep(i,n) for(int i=(n)-1;0<=i;i--) #define REP(i,n) for(int i=1;i<=n;i++) #define all(a) a.begin(),a.end() #define sort(a) sort(all(a)) #define rev(a) reverse(all(a)) char el='\n'; void YN(bool f){cout<<(f?"Yes":"No")<<"\n";} template bool chmin(T& x,T y){if(x>y){x=y;return true;}return false;} template bool chmax(T& x,T y){if(x istream &operator>>(istream &is, vector &v){ for(T &in : v) is >> in; return is;} template ostream &operator<<(ostream &os, vector &v){ rep(i,v.size()) os << v[i] << (i+1==v.size()?"":" "); return os;} template struct modint{ public: ll x; modint(ll x=0) : x((x%mod+mod)%mod) {} modint operator-() const { return modint(-x); } modint& operator+=(const modint& a){ if(mod<=(x += a.x)) x-=mod; return *this; } modint& operator-=(const modint& a){ if(mod<=(x+=mod-a.x)) x-=mod; return *this; } modint& operator*=(const modint& a){ (x*=a.x)%=mod; return *this; } modint& operator++(){ ++x; return *this; } modint operator++(int){ modint temp = *this; x++; return temp; } modint& operator--(){ --x; return *this; } modint operator--(int){ modint temp = *this; x--; return temp; } modint pow(ll t) const{ modint a=1,b=x; while(t){ if(t&1) a*=b; b*=b; t/=2; } return a; } modint inv() const { return pow(mod-2); } modint& operator/=(const modint& a){ return (*this)*=a.inv(); } friend modint operator+(const modint& a, const modint& b) { return modint(a)+=b; } friend modint operator-(const modint& a, const modint& b) { return modint(a)-=b; } friend modint operator*(const modint& a, const modint& b) { return modint(a)*=b; } friend modint operator/(const modint& a, const modint& b) { return modint(a)/=b; } friend bool operator==(const modint& a, const modint& b) { return (modint(a).x==b.x); } friend bool operator!=(const modint& a, const modint& b) { return (modint(a).x!=b.x); } friend ostream& operator<<(ostream& os, const modint& m){ os << m.x; return os; } friend istream& operator>>(istream& is, modint& m){ is >> m.x; return is; } }; using fp998=modint<998244353>; using fp107=modint<1000000007>; int n; bool in(int i){ return (0<=i && i> n; vector s(n); cin >> s; vector>> dp(n, vector>(n, vector(n))); rep(i,n) dp[i][i][0] = 1; rep(l,n-1) rep(i1,n) rep(i2,n){ int j1 = n-1-i1-l; int j2 = n-1-i2+l; rep(k,4){ int x1 = i1, x2 = i2, y1 = j1, y2 = j2; if(k&1) x1--; else y1--; if(k&2) x2++; else y2++; if(in(x1) && in(x2) && in(y1) && in(y2) && s[x1][y1]==s[x2][y2]) dp[x1][x2][l+1] += dp[i1][i2][l]; } } cout << dp[0][n-1][n-1] << el; }