1 条题解

  • 0
    @ 2026-6-17 18:03:21

    题意

    • 有一张 n 行 m 列的地图,地图上的每个点,要么是墙壁 # 要么是空地 . 要么是炸弹(一个 1 ~ 9 的数字)
    • 问,当所有炸弹都爆炸之后,地图是什么样子
      • 炸弹会把自己所在位置以及距离自己曼哈顿距离在对应数字以内的位置都变为空地
    • 输出炸弹爆炸之后的结果

    思路

    • 注意到炸弹的数字都很小,完全可以枚举以炸弹为中心,对应数字为半径的一个正方形
    • 对于其中曼哈顿距离在范围内的点打上标记(要注意先判坐标是否越界)
    • 最后输出的时候对于数字位置和有标记位置都输出 .,其它位置保持原样
    • 时间为 O(n×m×92)O(n\times m \times 9^2) 刚好能过

    code

    char a[N][N];
    bool vis[N][N];
    
    void solved() {
    	
    	int n, m;	cin >> n >> m;
    	for(int i = 1; i <= n; i ++) {
    		for(int j = 1; j <= m; j ++) {
    			cin >> a[i][j];
    			if(a[i][j] >= '1' && a[i][j] <= '9') {
    				int d = a[i][j] - '0';
    				for(int x = i - d; x <= i + d; x ++) {
    					for(int y = j - d; y <= j + d; y ++) {
    						// 跳过越界的坐标
    						if(x < 1 || x > n || y < 1 || y > m) continue;
    						// 跳过曼哈顿距离过大的坐标
    						if(abs(x - i) + abs(y - j) > d) continue;
    						vis[x][y] = true;
    					}
    				}
    			}
    		}
    	}
    	
    	for(int i = 1; i <= n; i ++) {
    		for(int j = 1; j <= m; j ++) {
    			if(vis[i][j]) cout << '.';
    			else cout << a[i][j];
    		}
    		cout << endl;
    	}
    	
    	return ;
    }
    
    • 1

    信息

    ID
    161
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    10
    已通过
    1
    上传者