#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<tuple>
using namespace std;

#define N 2010
int n;
char dir[N];
const int dx[]={0, 0, -1, 1}, dy[]={-1, 1, 0, 0};
int tugi[N*N], hno[N*N], s[N*N], op[N*N];
bool vis[N*N];
inline bool ingrid(int x, int y){
    return 0<=x && x<=n-1 && 0<=y && y<=n-1;
}
inline int sc(int x, int y){
    return x*n+y;
}
void dfs(int i){
    if(s[i]) return;
    s[i] = 1;
    int x=i/n, y=i%n;
    for(int j=0; j<=3; j++) if(ingrid(x+dx[j], y+dy[j])){
        int ch = sc(x+dx[j], y+dy[j]);
        if(tugi[ch] != i) continue;
        dfs(ch);
        if(s[i] < s[ch]+1){
            op[i] = ch;
            s[i] = s[ch]+1;
        }
    }
}

int main(){
    scanf("%d", &n);
    for(int i=0; i<=n-1; i++){
        scanf("%s", dir);
        for(int j=0; j<=n-1; j++){
            int k = -1;
            switch(dir[j]){
                case 'l': k=0; break;
                case 'r': k=1; break;
                case 'u': k=2; break;
                case 'd': k=3; break;
            }
            if(ingrid(i+dx[k], j+dy[k])){
                tugi[sc(i, j)] = sc(i+dx[k], j+dy[k]);
            }else{
                tugi[sc(i, j)] = sc(i, j);
            }
        }
    }
    vector<int> toubu;
    for(int i=0; i<=n*n-1; i++) if(!vis[i]){
        int usagi=i, kame=i;
        bool loli = true;
        do{
            usagi = tugi[tugi[usagi]];
            kame = tugi[kame];
            if(vis[kame]){
                loli=false; break;
            }
        }while(usagi!=kame);
        if(loli){
            do{
                usagi = tugi[usagi];
                s[kame]++;
            }while(usagi!=kame);
            toubu.push_back(kame);
        }
        for(kame=i; !vis[kame]; kame=tugi[kame]){
            vis[kame] = true;
        }
    }
    memset(hno, -1, n*n*sizeof(int));
    for(int i=0; i<(int)toubu.size(); i++){
        for(int j=toubu[i]; hno[j]==-1; j=tugi[j]){
            hno[j] = i;
        }
    }
    memset(op, -1, n*n*sizeof(int));
    for(int i=0; i<=n*n-1; i++) if(hno[i]==-1){
        dfs(i);
    }
    for(int i=0; i<=n*n-1; i++) if(hno[i]==-1 && ~hno[tugi[i]]){
        int h = toubu[hno[tugi[i]]];
        if(op[h]==-1 || s[i]>s[op[h]]){
            s[h] += s[i]-s[op[h]];
            op[h] = i;
        }
    }
    priority_queue<pair<int, int>> pq;
    for(int i=0; i<(int)toubu.size(); i++){
        pq.push(make_pair(s[toubu[i]], toubu[i]));
    }
    int ans = 0;
    for(int c=1; !pq.empty(); c^=1){
        int d, i;
        tie(d, i) = pq.top(); pq.pop();
        if(c) ans += d;
        if(~hno[i]){
            int j = i;
            do{
                int x=j/n, y=j%n;
                for(int k=0; k<=3; k++) if(ingrid(x+dx[k], y+dy[k])){
                    int ch = sc(x+dx[k], y+dy[k]);
                    if(~hno[ch] || tugi[ch]!=j || ch==op[i]) continue;
                    pq.push(make_pair(s[ch], ch));
                }
                j = tugi[j];
            }while(j!=i);
            if(op[i] == -1) continue;
            i = op[i];
        }
        for(; ~op[i]; i=op[i]){
            int x=i/n, y=i%n;
            for(int j=0; j<=3; j++) if(ingrid(x+dx[j], y+dy[j])){
                int ch = sc(x+dx[j], y+dy[j]);
                if(tugi[ch]!=i || ch==op[i]) continue;
                pq.push(make_pair(s[ch], ch));
            }
        }
    }
    printf("%d\n", ans);
    return 0;
}
