#pragma GCC optimize ("O3") #include using namespace std; typedef long long ll; typedef pair ii; typedef vector vi; typedef double K; constexpr int INF = 0x3f3f3f3f; #define FOR(i, b, e) for(int i = (b); i < (e); i++) #define TRAV(x, a) for(auto &x: (a)) #define SZ(x) ((int)(x).size()) #define PB push_back #define X first #define Y second // template ostream & operator << (ostream&os, const pair & para) { os << para.first << ' ' << para.second; return os; } // template ostream & operator << (ostream&os, const vector & vec){ for(int i = 0; i < sz(vec); i++) os << vec[i] << (i == sz(vec) - 1 ? "" : " "); return os; } constexpr int N = 55; int n; string s[N]; int dx[8] = {1, 0, -1, 0, 1, 1, -1, -1}, dy[8] = {0, -1, 0, 1, 1, -1, -1, 1}; int kx[8] = {1, 2, 2, 1, -1, -2, -2, -1}, ky[8] = {2, 1, -1, -2, -2, -1, 1, 2}; bool onBoard(int a, int b) { return 0 <= a && a < n && 0 <= b && b < n; } int suns() { vector> illu(n, vector(n)); FOR(i, 0, n) FOR(j, 0, n) { if(s[i][j] != '*') continue; FOR(k, 0, 8) { int x = i + dx[k], y = j + dy[k]; while(onBoard(x, y) && s[x][y] == ' ') x += dx[k], y += dy[k]; if(onBoard(x, y) && s[x][y] != '*') illu[x][y] = 1; } } int ret = 0; FOR(i, 0, n) FOR(j, 0, n) ret += illu[i][j]; // cerr << "SUNS: " << ret * 100 << '\n'; return ret * 100; } int biggest() { int ret = 0; vector> vis(n, vector(n)); queue q; FOR(i, 0, n) FOR(j, 0, n) { if(s[i][j] != 'v' && s[i][j] != 'D') continue; if(vis[i][j]) continue; vector ziomy; vis[i][j] = 1; q.push({i, j}); while(!q.empty()) { auto v = q.front(); q.pop(); ziomy.PB(v); FOR(k, 0, 4) { int x = v.X + dx[k], y = v.Y + dy[k]; if(onBoard(x, y) && !vis[x][y]) { if(s[x][y] != 'v' && s[x][y] != 'D') continue; vis[x][y] = 1, q.push({x, y}); } } } sort(ziomy.begin(), ziomy.end()); int ans = 1, akt = 1; FOR(k, 1, SZ(ziomy)) { if(ziomy[k - 1].X == ziomy[k].X && ziomy[k - 1].Y + 1 == ziomy[k].Y) akt++; else akt = 1; ans = max(ans, akt); } ret += ans; } // cerr << "BIGGEST: " << ret * 500 << '\n'; return ret * 500; } int flock() { int ret = 0; vector> vis(n, vector(n)); queue q; FOR(i, 0, n) FOR(j, 0, n) { if(s[i][j] != 'v' && s[i][j] != 'D') continue; if(vis[i][j]) continue; vector ziomy; vis[i][j] = 1; q.push({i, j}); while(!q.empty()) { auto v = q.front(); q.pop(); ziomy.PB(v); FOR(k, 0, 4) { int x = v.X + dx[k], y = v.Y + dy[k]; if(onBoard(x, y) && !vis[x][y]) { if(s[x][y] != 'v' && s[x][y] != 'D') continue; vis[x][y] = 1, q.push({x, y}); } } } int ans = 0; TRAV(v, ziomy) FOR(k, 0, 4) { int x = v.X + dx[k], y = v.Y + dy[k]; if(!onBoard(x, y) || (s[x][y] != 'v' && s[x][y] != 'D')) { ans++; } } ret += ans; } // cerr << "FLOCK: " << ret * 60 << '\n'; return ret * 60; } int house() { int ret = 0; FOR(i, 0, n) FOR(j, 0, n) { if(s[i][j] != '^') continue; for(int k = i - 1; k >= 0; k--) { if(s[k][j] == ' ') ret++; else break; } } // cerr << "HOUSE: " << ret * 10 << '\n'; return ret * 10; } int blocks() { set se; FOR(i, 0, n - 2) FOR(j, 0, n - 2) { string ss; FOR(kk, 0, 3) ss += s[i + kk].substr(j, 3); se.insert(ss); } // cerr << "BLOCKS: " << SZ(se) << '\n'; return SZ(se); } int animal() { int ret = 0; FOR(i, 0, n) FOR(j, 0, n) { if(s[i][j] != '!' && s[i][j] != 'v' && s[i][j] != 'D') continue; FOR(k, 0, 4) { int x = i + dx[k], y = j + dy[k]; if(onBoard(x, y) && s[x][y] == ' ') ret++; } } // cerr << "ANIMAL: " << ret * 15 << '\n'; return ret * 15; } int freedom() { vector> vis(n, vector(n)); queue q; FOR(i, 0, n) FOR(j, 0, n) { bool ok = 0; FOR(k, 0, 4) { int x = i + dx[k], y = j + dy[k]; if(!onBoard(x, y)) ok = 1; } if(ok) q.push({i, j}), vis[i][j] = 1; } while(!q.empty()) { ii v = q.front(); q.pop(); if(s[v.X][v.Y] != ' ') continue; FOR(k, 0, 4) { int x = v.X + dx[k], y = v.Y + dy[k]; if(onBoard(x, y) && !vis[x][y]) q.push({x, y}), vis[x][y] = 1; } } int ret = 0; FOR(i, 0, n) FOR(j, 0, n) if(vis[i][j] && s[i][j] != ' ') ret++; // cerr << "FREEDOM: " << ret * 7 << '\n'; return ret * 7; } int chupa() { int ret = 0; FOR(i, 0, n) FOR(j, 0, n) { if(s[i][j] != 'D' && s[i][j] != 'v') continue; FOR(k, 0, 8) { int x = i + kx[k], y = j + ky[k]; if(onBoard(x, y) && s[x][y] == '!') { ret++; break; } } } // cerr << "CHUPA: " << ret * 200 << '\n'; return ret * 200; } int peaks() { vector xd; FOR(i, 0, n) FOR(j, 0, n - 1) { if(s[i][j] == '/' && s[i][j + 1] == '\\') xd.PB({i, j}); } int ret = 0; TRAV(x, xd) { int maks = 0; TRAV(y, xd) maks = max(maks, abs(x.X - y.X) + abs(x.Y - y.Y)); ret += maks; } // cerr << "PEAKS: " << ret * 50 << '\n'; return ret * 50; } int drake() { int ret = 0; FOR(i, 0, n) FOR(j, 0, n) { if(s[i][j] != 'D') continue; FOR(k, 0, 4) { int x = i + dx[k], y = j + dy[k]; if(onBoard(x, y) && s[x][y] == 'G') { ret++; break; } } } // cerr << "DRAKE: " << ret * 500 << '\n'; return ret * 500; } int mini() { set obj; FOR(i, 0, n) FOR(j, 0, n) if(s[i][j] != ' ') obj.insert(s[i][j]); if(SZ(obj) == 0) return 0; int minik = INF; int ret = 0; TRAV(x, obj) { int akt = 0; FOR(i, 0, n) FOR(j, 0, n) akt += s[i][j] == x; if(akt < minik) minik = akt, ret = 0; if(akt == minik) ret += akt; } // cerr << "MINI: " << ret * 10 << '\n'; return ret * 10; } int empti() { int ret = 0; FOR(i, 0, n) FOR(j, 0, n) ret += s[i][j] == ' '; // cerr << "EMPTI: " << ret * 1 << '\n'; return ret * 1; } int ani2() { int cn1 = 0, cn2 = 0, cn3 = 0; FOR(i, 0, n) FOR(j, 0, n) { if(s[i][j] == '!') cn1++; if(s[i][j] == 'v') cn2++; if(s[i][j] == 'D') cn3++; } // cerr << "ANI2: " << 1ll * cn1 * cn2 * cn3 * 1 << '\n'; return 1ll * cn1 * cn2 * cn3 * 1; } int house2() { int ret = 0; FOR(i, 0, n) FOR(j, 0, n) { if(s[i][j] != '^') continue; for(int k = i - 1; k >= 0; k--) { if(s[k][j] == ' ') ret++; else break; } } // cerr << "HOUSE2: " << ret * 5 << '\n'; return ret * 5; } int grill() { int ret = 0; FOR(i, 0, n) FOR(j, 0, n) { if(s[i][j] != 'G') continue; FOR(k, 0, 4) { int x = i + dx[k], y = j + dy[k]; if(onBoard(x, y) && s[x][y] == 'D') { ret++; break; } } } // cerr << "GRILL: " << ret * 50 << '\n'; return ret * 50; } int hg() { int cn1 = 0, cn2 = 0; FOR(i, 0, n) FOR(j, 0, n) { if(s[i][j] == '^') cn1++; if(s[i][j] == 'G') cn2++; } // cerr << "HG: " << min(cn1, cn2) * 3 << '\n'; return min(cn1, cn2) * 3; } void solve() { cin >> n; cin.ignore(); FOR(i, 0, n) getline(cin, s[i]); ll ans = 0; ans += suns(); ans += biggest(); ans += flock(); ans += house(); // todo ans += blocks(); ans += animal(); ans += freedom(); ans += chupa(); ans += peaks(); ans += drake(); ans += mini(); ans += empti(); ans += ani2(); ans += house2(); //zjebane ans += grill(); ans += hg(); cout << ans << '\n'; } int main() { ios::sync_with_stdio(0); cin.tie(0); // int tt; cin >> tt; // FOR(te, 0, tt) { // cout << "Case #" << te + 1 << ": "; // solve(); // } solve(); return 0; }