#include #include #include #include #include using namespace std; typedef long long ll; typedef pair pii; #define x first #define y second #define mp make_pair #define mt make_tuple const int MAXN = 50; int n, cnt[MAXN + 5][MAXN + 5], br[205]; string s[MAXN + 5]; bool je[MAXN + 5][MAXN + 5], bio[MAXN + 5][MAXN + 5]; vector f; const int dx[4] = {1, 0, -1, 0}; const int dy[4] = {0, -1, 0, 1}; const int kn_x[8] = {-2, -2, -1, 1, 2, 2, 1, -1}; const int kn_y[8] = {-1, 1, 2, 2, 1, -1, -2, -2}; void dfs(int x, int y){ if(bio[x][y]) return; bio[x][y] = 1; f.push_back(mp(x, y)); for(int i = 0 ; i < 4 ; ++i){ int nx = x + dx[i]; int ny = y + dy[i]; if(nx < 0 || nx >= n || ny < 0 || ny >= n || bio[nx][ny] || (s[nx][ny] != 'v' && s[nx][ny] != 'D')) continue; dfs(nx, ny); } } bool is_animal(int x, int y){ if(s[x][y] == '!' || s[x][y] == 'v' || s[x][y] == 'D') return 1; return 0; } void dfs2(int x, int y){ if(bio[x][y]) return; bio[x][y] = 1; for(int i = 0 ; i < 4 ; ++i){ int nx = x + dx[i]; int ny = y + dy[i]; if(nx < 0 || nx >= n || ny < 0 || ny >= n || bio[nx][ny] || s[x][y] != ' ') continue; dfs2(nx, ny); } } bool is_free(int x, int y){ if(x == 0 || x == n - 1 || y == 0 || y == n - 1) return 1; memset(bio, 0, sizeof(bio)); dfs2(x, y); for(int i = 0 ; i < n - 1 ; ++i){ if(bio[0][i] || bio[i][n - 1] || bio[n - 1][n - i - 1] || bio[n - i - 1][0]) return 1; } return 0; } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; cin.ignore(); for(int i = 0 ; i < n ; ++i){ getline(cin, s[i]); } //suns ll sol = 0; for(int x = 0 ; x < n ; ++x){ for(int y = 0 ; y < n ; ++y){ if(s[x][y] != '*') continue; for(int i = 1 ; ; ++i){ int nx = x - i; int ny = y - i; if(nx < 0 || nx >= n || ny < 0 || ny >= n) break; if(s[nx][ny] == '*') break; if(s[nx][ny] == ' ') continue; je[nx][ny] = 1; break; } for(int i = 1 ; ; ++i){ int nx = x - i; int ny = y + i; if(nx < 0 || nx >= n || ny < 0 || ny >= n) break; if(s[nx][ny] == '*') break; if(s[nx][ny] == ' ') continue; je[nx][ny] = 1; break; } for(int i = 1 ; ; ++i){ int nx = x + i; int ny = y + i; if(nx < 0 || nx >= n || ny < 0 || ny >= n) break; if(s[nx][ny] == '*') break; if(s[nx][ny] == ' ') continue; je[nx][ny] = 1; break; } for(int i = 1 ; ; ++i){ int nx = x + i; int ny = y - i; if(nx < 0 || nx >= n || ny < 0 || ny >= n) break; if(s[nx][ny] == '*') break; if(s[nx][ny] == ' ') continue; je[nx][ny] = 1; break; } for(int i = 1 ; ; ++i){ int nx = x - i; int ny = y; if(nx < 0 || nx >= n || ny < 0 || ny >= n) break; if(s[nx][ny] == '*') break; if(s[nx][ny] == ' ') continue; je[nx][ny] = 1; break; } for(int i = 1 ; ; ++i){ int nx = x + i; int ny = y; if(nx < 0 || nx >= n || ny < 0 || ny >= n) break; if(s[nx][ny] == '*') break; if(s[nx][ny] == ' ') continue; je[nx][ny] = 1; break; } for(int i = 1 ; ; ++i){ int nx = x; int ny = y - i; if(nx < 0 || nx >= n || ny < 0 || ny >= n) break; if(s[nx][ny] == '*') break; if(s[nx][ny] == ' ') continue; je[nx][ny] = 1; break; } for(int i = 1 ; ; ++i){ int nx = x; int ny = y + i; if(nx < 0 || nx >= n || ny < 0 || ny >= n) break; if(s[nx][ny] == '*') break; if(s[nx][ny] == ' ') continue; je[nx][ny] = 1; break; } } } for(int x = 0 ; x < n ; ++x){ for(int y = 0 ; y < n ; ++y){ sol += (je[x][y] ? 100LL : 0LL); } } //bigest bird, flock perimeter int cur = 0; for(int x = 0 ; x < n ; ++x){ for(int y = 0 ; y < n ; ++y){ if(bio[x][y] || (s[x][y] != 'v' && s[x][y] != 'D')) continue; dfs(x, y); sort(f.begin(), f.end()); int maxi = 0; int i = 0; while(i < (int)f.size()){ int sad = f[i].x; int lst = -2, poc = -1; for( ; i < (int)f.size() && f[i].x == sad ; ++i){ if(f[i].y - 1 != lst){ maxi = max(maxi, lst - poc + 1); poc = f[i].y; } lst = f[i].y; } maxi = max(maxi, lst - poc + 1); } sol += 500LL * maxi; cur++; for(i = 0 ; i < (int)f.size() ; ++i){ cnt[f[i].x][f[i].y] = cur; } for(i = 0 ; i < n ; ++i){ if(cnt[i][0] == cur){ sol += 60; } for(int j = 0 ; j < n - 1 ; ++j){ if((cnt[i][j] == cur && cnt[i][j + 1] != cur) || (cnt[i][j + 1] == cur && cnt[i][j] != cur)){ sol += 60; } } if(cnt[i][n - 1] == cur){ sol += 60; } } for(int j = 0 ; j < n ; ++j){ if(cnt[0][j] == cur){ sol += 60; } for(i = 0 ; i < n - 1 ; ++i){ if((cnt[i][j] == cur && cnt[i + 1][j] != cur) || (cnt[i + 1][j] == cur && cnt[i][j] != cur)){ sol += 60; } } if(cnt[n - 1][j] == cur){ sol += 60; } } } } //house view up for(int i = 1 ; i < n ; ++i){ for(int j = 0 ; j < n ; ++j){ if(s[i][j] == '^' && s[i - 1][j] == ' '){ sol += 10LL; sol += 5LL; } } } //3x3 blocks sol += (ll)(n - 2) * (n - 2); //animals I for(int i = 0 ; i < n ; ++i){ for(int j = 0 ; j < n - 1 ; ++j){ if(is_animal(i, j) && s[i][j + 1] == ' '){ sol += 15LL; } } } for(int j = 0 ; j < n ; ++j){ for(int i = 0 ; i < n - 1 ; ++i){ if(is_animal(i, j) && s[i + 1][j] == ' '){ sol += 15LL; } } } //freedom for(int i = 0 ; i < n ; ++i){ for(int j = 0 ; j < n ; ++j){ if(is_free(i, j) && s[i][j] != ' '){ sol += 7LL; } } } //Chupacabra for(int i = 0 ; i < n ; ++i){ for(int j = 0 ; j < n ; ++j){ for(int w = 0 ; w < 8 ; ++w){ int nx = i + kn_x[w]; int ny = j + kn_y[w]; if(nx < 0 || nx >= n || ny < 0 || ny >= n) continue; if(s[nx][ny] == '!'){ sol += 200LL; break; } } } } //Peaks vector peakovi; for(int i = 0 ; i < n ; ++i){ for(int j = 0 ; j < n - 1 ; ++j){ if(s[i][j] == '/' && s[i][j + 1] == '\\'){ peakovi.push_back(mp(i, j)); } } } for(pii i : peakovi){ int maxi = 0; for(pii j : peakovi){ maxi = max(abs(i.x - j.x) + abs(i.y - j.y), maxi); } sol += 50LL * maxi; } //drake/grill for(int i = 0 ; i < n ; ++i){ for(int j = 0 ; j < n ; ++j){ if(s[i][j] != 'D') continue; for(int w = 0 ; w < 4 ; ++w){ int nx = i + dx[w]; int ny = j + dy[w]; if(nx < 0 || nx >= n || ny < 0 || ny >= n) continue; if(s[nx][ny] == 'G'){ sol += 500LL; break; } } } } //minimum frequency for(int i = 0 ; i < n ; ++i){ for(int j = 0 ; j < n ; ++j){ br[s[i][j]]++; } } int mini = -1; for(int i = 0 ; i < n ; ++i){ for(int j = 0 ; j < n ; ++j){ if(s[i][j] == ' ') continue; if(mini == -1 || br[s[i][j]] < mini){ mini = br[s[i][j]]; } } } if(br['*'] == mini){ sol += 10LL; } if(br['^'] == mini){ sol += 10LL; } if(br['!'] == mini){ sol += 10LL; } if(br['/'] == mini){ sol += 10LL; } if(br['\\'] == mini){ sol += 10LL; } if(br['v'] == mini){ sol += 10LL; } if(br['D'] == mini){ sol += 10LL; } if(br['G'] == mini){ sol += 10LL; } //empty fields for(int i = 0 ; i < n ; ++i){ for(int j = 0 ; j < n ; ++j){ if(s[i][j] == ' '){ sol += 1LL; } } } //Animals II sol += (ll)br['!'] * br['v'] * br['D']; //Grill/drake for(int i = 0 ; i < n ; ++i){ for(int j = 0 ; j < n ; ++j){ if(s[i][j] != 'G') continue; for(int w = 0 ; w < 4 ; ++w){ int nx = i + dx[w]; int ny = j + dy[w]; if(nx < 0 || nx >= n || ny < 0 || ny >= n) continue; if(s[nx][ny] == 'D'){ sol += 50LL; break; } } } } //houses and grills int br1 = 0; int br2 = 0; for(int i = 0 ; i < n ; ++i){ for(int j = 0 ; j < n ; ++j){ if(s[i][j] == '^'){ br1++; } if(s[i][j] == 'G'){ br2++; } } } sol += min(br1, br2) * 3LL; cout << sol << "\n"; return 0; } /* 3 ! v D */