#include #include #define chmin(x,y) (x) = min((x),(y)) #define chmax(x,y) (x) = max((x),(y)) #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define vec vector #define all(a) a.begin(), a.end() #define rall(a) a.rbegin(), a.rend() #define pb push_back #define eb emplace_back using namespace std; using namespace atcoder; using ll = long long; using ld = long double; const ll mod = 998244353; using mint = modint998244353; const vector dx = {1,0,-1,0}, dy = {0,1,0,-1}; // using Graph = vector>>; using Graph = vector>; int main(){ // input int N; cin >> N; vec S(N); rep(i,N) cin >> S[i]; if(S[0][0] != S[N-1][N-1]){ cout << 0 << endl; return 0; } // solve const int M = N-1; vec dp(M+1,vec(N,vec(N,(mint)0))); dp[0][0][N-1] = 1; rep(i,M) rep(j,N) rep(k,N){ rep(l,2) rep(m,2){ int x1 = j+dx[l], y1 = i-j+dy[l]; int x2 = k-dx[m], y2 = 2*N-2-i-k-dy[m]; if(x1 >= N || y1 >= N || x2 < 0 || y2 < 0) continue; if(S[x1][y1] == S[x2][y2]){ dp[i+1][x1][x2] += dp[i][j][k]; } } } // output mint ans = 0; rep(i,N) ans += dp[M][i][i]; cout << ans.val() << endl; }