#include <bits/stdc++.h>
using namespace std;
void fastio() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
}
int n;
vector<vector<char>> grid;
vector<vector<bool>> vis;
bool valid(int x, int y) {
return (x >= 0 && x < n && y >= 0 && y < n);
}
int count_x = 0;
void dfs(int x, int y) {
if (!valid(x, y) || grid[x][y] == '.' || vis[x][y])
return;
vis[x][y] = true;
if (grid[x][y] == 'x')
count_x++;
dfs(x + 1, y);
dfs(x - 1, y);
dfs(x, y + 1);
dfs(x, y - 1);
}
int count_ships() {
int cnt = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if ((grid[i][j] == 'x' || grid[i][j] == '@') && !vis[i][j]) {
count_x = 0;
dfs(i, j);
if (count_x > 0)
cnt++;
}
}
}
return cnt;
}
void solve(int t) {
cin >> n;
grid.resize(n, vector<char>(n));
vis.assign(n, vector<bool>(n, false));
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
cin >> grid[i][j];
count_x = 0;
cout << "Case " << t << ": " << count_ships() << '\n';
grid.clear();
vis.clear();
}
int main() {
fastio();
int t = 1;
cin >> t;
for (int i = 1; i <= t; ++i)
solve(i);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2b2lkIGZhc3RpbygpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsKICAgIGNvdXQudGllKG51bGxwdHIpOwp9CgppbnQgbjsKdmVjdG9yPHZlY3RvcjxjaGFyPj4gZ3JpZDsKdmVjdG9yPHZlY3Rvcjxib29sPj4gdmlzOwoKYm9vbCB2YWxpZChpbnQgeCwgaW50IHkpIHsKICAgIHJldHVybiAoeCA+PSAwICYmIHggPCBuICYmIHkgPj0gMCAmJiB5IDwgbik7Cn0KCmludCBjb3VudF94ID0gMDsKdm9pZCBkZnMoaW50IHgsIGludCB5KSB7CiAgICBpZiAoIXZhbGlkKHgsIHkpIHx8IGdyaWRbeF1beV0gPT0gJy4nIHx8IHZpc1t4XVt5XSkKICAgICAgICByZXR1cm47CiAgICAKICAgIHZpc1t4XVt5XSA9IHRydWU7CiAgICBpZiAoZ3JpZFt4XVt5XSA9PSAneCcpCiAgICAgICAgY291bnRfeCsrOwogICAgCiAgICBkZnMoeCArIDEsIHkpOwogICAgZGZzKHggLSAxLCB5KTsKICAgIGRmcyh4LCB5ICsgMSk7CiAgICBkZnMoeCwgeSAtIDEpOwp9CgppbnQgY291bnRfc2hpcHMoKSB7CiAgICBpbnQgY250ID0gMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKICAgICAgICAgICAgaWYgKChncmlkW2ldW2pdID09ICd4JyB8fCBncmlkW2ldW2pdID09ICdAJykgJiYgIXZpc1tpXVtqXSkgewogICAgICAgICAgICAgICAgY291bnRfeCA9IDA7CiAgICAgICAgICAgICAgICBkZnMoaSwgaik7CiAgICAgICAgICAgICAgICBpZiAoY291bnRfeCA+IDApCiAgICAgICAgICAgICAgICAgICAgY250Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gY250Owp9Cgp2b2lkIHNvbHZlKGludCB0KSB7CiAgICBjaW4gPj4gbjsKCiAgICBncmlkLnJlc2l6ZShuLCB2ZWN0b3I8Y2hhcj4obikpOwogICAgdmlzLmFzc2lnbihuLCB2ZWN0b3I8Ym9vbD4obiwgZmFsc2UpKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKQogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbjsgKytqKQogICAgICAgICAgICBjaW4gPj4gZ3JpZFtpXVtqXTsKICAgIAogICAgY291bnRfeCA9IDA7CiAgICBjb3V0IDw8ICJDYXNlICIgPDwgdCA8PCAiOiAiIDw8IGNvdW50X3NoaXBzKCkgPDwgJ1xuJzsKICAgIAogICAgZ3JpZC5jbGVhcigpOwogICAgdmlzLmNsZWFyKCk7Cn0KCmludCBtYWluKCkgewogICAgZmFzdGlvKCk7CiAgICBpbnQgdCA9IDE7CiAgICBjaW4gPj4gdDsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IHQ7ICsraSkKICAgICAgICBzb2x2ZShpKTsKICAgIHJldHVybiAwOwp9