#include <bits/stdc++.h>
using namespace std;
#define int long long
#define MOD 1000000007
#define MAX 505
char matrix[MAX][MAX];
int n, m;
void solve() {
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) cin >> matrix[i][j];
}
vector<vector<int>> dp(n + 1, vector<int>(n + 1, 0));
vector<vector<int>> dp_next(n + 1, vector<int>(n + 1, 0));
for (int i = 1; i <= n; i++) dp[i][i] = 1;
for (int a = 0; a <= n - 1; a++) {
for (int r1 = 1; r1 <= n; r1++) {
for (int r2 = n; r2 >= 1; r2--) {
int c1 = a + 2 - r1, c2 = 2 * n - a - r2;
if (a + 1 > n - 1 || (matrix[r1][c1] != matrix[r2][c2])) continue;
if (r1 + 1 <= n) {
// p xuong va q len
if (r2 - 1 >= 1 && matrix[r1 + 1][c1] == matrix[r2 - 1][c2])
dp_next[r1 + 1][r2 - 1] += dp[r1][r2] %= MOD;
// p xuong va q trai
if (c2 - 1 >= 1 && matrix[r1 + 1][c1] == matrix[r2][c2 - 1])
dp_next[r1 + 1][r2] += dp[r1][r2] %= MOD;
}
// p phai q trai
if (c1 + 1 <= n && c2 - 1 >= 1) {
if (matrix[r1][c1 + 1] == matrix[r2][c2 - 1])
dp_next[r1][r2] += dp[r1][r2] %= MOD;
}
// p phai q len
if (c1 + 1 <= n && r2 - 1 >= 1) {
if (matrix[r1][c1 + 1] == matrix[r2 - 1][c2])
dp_next[r1][r2 - 1] += dp[r1][r2] %= MOD;
}
}
}
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= n; j++) {
dp[i][j] = dp_next[i][j];
dp_next[i][j] = 0;
}
}
}
/*
for (int r1 = 1; r1 <= n; r1++) {
for (int r2 = n; r2 >= 1; r2--) {
for (int i = 0; i <= n; i++) {
for (int j = 0; j <= n; j++) {
dp[i][j] = dp_next[i][j];
dp_next[i][j] = 0;
}
}
for (int a = 0; a <= n - 1; a++) {
int c1 = a + 2 - r1, c2 = 2 * n - a - r2;
if (a + 1 > n - 1 || (matrix[r1][c1] != matrix[r2][c2])) continue;
if (r1 + 1 <= n) {
// p xuong va q len
if (r2 - 1 >= 1 && matrix[r1 + 1][c1] == matrix[r2 - 1][c2])
dp_next[r1 + 1][r2 - 1] += dp[r1][r2] %= MOD;
// p xuong va q trai
if (c2 - 1 >= 1 && matrix[r1 + 1][c1] == matrix[r2][c2 - 1])
dp_next[r1 + 1][r2] += dp[r1][r2] %= MOD;
}
// p phai q trai
if (c1 + 1 <= n && c2 - 1 >= 1) {
if (matrix[r1][c1 + 1] == matrix[r2][c2 - 1])
dp_next[r1][r2] += dp[r1][r2] %= MOD;
}
// p phai q len
if (c1 + 1 <= n && r2 - 1 >= 1) {
if (matrix[r1][c1 + 1] == matrix[r2 - 1][c2])
dp_next[r1][r2 - 1] += dp[r1][r2] %= MOD;
}
}
}
}
int answer = 0;
for (int r1 = 1; r1 <= n; r1++) {
for (int r2 = 1; r2 <= n; r2++) {
for (int a = 0; a <= n - 1; a++) {
int c1 = a + 2 - r1, c2 = 2 * n - a - r2;
if (r1 + c1 == n + 1 && r2 + c2 == n + 1) answer += dp[r1][r2] %= MOD;
}
}
}
*/
int answer = 0;
for (int a = 0; a <= n - 1; a++) {
for (int r1 = 1; r1 <= n; r1++) {
for (int r2 = n; r2 >= 1; r2--) {
int c1 = a + 2 - r1, c2 = 2 * n - a - r2;
if (r1 + c1 == n + 1 && r2 + c2 == n + 1) answer += dp[r1][r2] %= MOD;
}
}
}
cout << answer % MOD << '\n';
}
signed main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
// freopen("palpath.in", "r", stdin);
// freopen("palpath.out", "w", stdout);
solve();
}