#include <iostream>
using namespace std;
const int N = 109; // 定义一个常量N,作为数组的最大尺寸限制
char ch[N][N]; // 定义一个二维字符数组,用于存储地图上的字符
bool f[N][N]; // 定义一个二维布尔数组,用于记录哪些位置被访问过
int n, m; // 定义整数n和m,分别代表地图的行数和列数
// 定义一个函数cal,用于从给定的(x, y)坐标开始,在四个方向上扩展,并标记可达的位置
void cal(int x, int y) {
// 向上方向扩展
for (int i = 0; i < n; i++) {
if (x - i < 0) { // 如果超出了地图的上边界,则停止扩展
break;
}
f[x - i][y] = 1; // 标记当前位置为已访问
if (ch[x - i][y] == '*') { // 如果遇到障碍物'*',则停止扩展
break;
}
}
// 向下方向扩展
for (int i = 0; i < n; i++) {
if (x + i >= n) { // 如果超出了地图的下边界,则停止扩展
break;
}
f[x + i][y] = 1; // 标记当前位置为已访问
if (ch[x + i][y] == '*') { // 如果遇到障碍物'*',则停止扩展
break;
}
}
// 向左方向扩展
for (int i = 0; i < m; i++) {
if (y - i < 0) { // 如果超出了地图的左边界,则停止扩展
break;
}
f[x][y - i] = 1; // 标记当前位置为已访问
if (ch[x][y - i] == '*') { // 如果遇到障碍物'*',则停止扩展
break;
}
}
// 向右方向扩展
for (int i = 0; i < m; i++) {
if (y + i >= m) { // 如果超出了地图的右边界,则停止扩展
break;
}
f[x][y + i] = 1; // 标记当前位置为已访问
if (ch[x][y + i] == '*') { // 如果遇到障碍物'*',则停止扩展
break;
}
}
}
int main() {
cin >> n >> m; // 输入地图的行数和列数
for (int i = 0; i < n; i++) {
cin >> ch[i]; // 输入地图的每一行字符
}
// 遍历地图的每个位置,查找起始点'@'
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (ch[i][j] == '@') {
cal(i, j); // 如果找到起始点'@',则从该点开始扩展
}
}
}
int ans = 0; // 初始化计数器为0,用于统计被访问过的位置数量
// 遍历f数组,统计被访问过的位置数量
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (f[i][j]) {
ans++; // 如果某个位置被访问过,则计数器加1
}
}
}
cout << ans << endl; // 输出被访问过的位置数量
return 0; // 程序正常退出
}