#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 515;
const int MOD = 1e9 + 7;
int N;
char A[MAXN][MAXN];
int dp[MAXN][MAXN], pre[MAXN][MAXN];
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// freopen("RPATH.inp", "r", stdin);
// freopen("RPATH.out", "w", stdout);
cin >> N;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
cin >> A[i][j];
}
}
if (A[1][1] != A[N][N]) {
cout << 0;
return 0;
}
pre[1][N] = dp[1][N] = 1;
for (int t = 2; t <= N; t++) {
for (int ai = 1; ai <= N; ai++) {
for (int bi = 1; bi <= N; bi++) {
int ay = t - ai + 1, by = N - (t - (N - bi + 1) + 1) + 1;
dp[ai][bi] = 0;
if (t - ai < 0 || t - (N - bi + 1) < 0) continue;
if (ay < 1 || ay > N || by < 1 || by > N) continue;
if (A[ai][ay] == A[bi][by]) {
if (ai > 1 && bi < N) dp[ai][bi] = (dp[ai][bi] + pre[ai - 1][bi + 1]) % MOD;
if (bi < N) dp[ai][bi] = (dp[ai][bi] + pre[ai][bi + 1]) % MOD;
if (ai > 1) dp[ai][bi] = (dp[ai][bi] + pre[ai - 1][bi]) % MOD;
dp[ai][bi] = (dp[ai][bi] + pre[ai][bi]) % MOD;
}
}
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
pre[i][j] = dp[i][j];
}
}
}
int ans = 0;
for (int ai = 1; ai <= N; ai++) {
for (int bi = 1; bi <= N; bi++) {
int ay = N - ai + 1, by = N - (N - (N - bi + 1) + 1) + 1;
//cout << ai << ' ' << ay << ' ' << bi << ' ' << by << ' ';
if (ai == bi && ay == by) {
// cout << 1 << ' ';
// cout << dp[ai][bi] << ' ';
ans += dp[ai][bi];
}
//cout << '\n';
}
}
cout << ans;
}