#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; // 程序正常退出 }
标签:ch,int,地图,扩展,break,++,聚光灯 From: https://www.cnblogs.com/iswuyi/p/18132997