聚光灯

#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; // 程序正常退出  
}

 

posted @ 2024-04-13 16:07  Boy^  阅读(21)  评论(0)    收藏  举报