熱門文章

2025年2月11日 星期二

ZeroJudge 解題筆記:e838. P5. 炸彈超人(Bombs)

作者:王一哲
日期:2025年2月11日



ZeroJudge 題目連結:e838. P5. 炸彈超人(Bombs)

解題想法


這題先將炸彈的位置儲存起來,等讀取完整個地圖資料之後再處理會比較方便。

Python 程式碼


使用時間約為 25 ms,記憶體約為 3.4 MB,通過測試。
n = int(input())  # 地圖為 n*n
bomb = []  # 炸彈位置
grid = []  # 地圖
for i in range(n):  # 讀取 n 行資料
    row = list(input().strip())  # 一行資料,轉成串列
    grid.append(row)  # row 加入 grid
    for j, ch in enumerate(row):  # 依序由 row 讀取字元 ch
        if ch == "*": bomb.append((i, j))  # ch 是炸彈,位置 (i, j) 加入 bomb
for i, j in bomb:  # 讀取炸彈位置 (i, j),將十字方向上的位置皆改成 *
    for c in range(j, -1, -1): grid[i][c] = "*"
    for c in range(j, n, 1): grid[i][c] = "*"
    for r in range(i, -1, -1): grid[r][j] = "*"
    for r in range(i, n, 1): grid[r][j] = "*"
for row in grid:  # 由 grid 依序讀取整列的資料
    print("".join(row))  # 將 row 接成字串再印出


C++ 程式碼


使用時間約為 3 ms,記憶體約為 364 kB,通過測試。
#include <iostream>
#include <vector>
#include <utility>
#include <string>
using namespace std;

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int n; cin >> n;  // 地圖為 n*n
    vector<pair<int, int>> bomb;  // 炸彈位置
    vector<string> grid (n);  // 地圖
    for(int i=0; i<n; i++) {  // 讀取 n 行資料
        cin >> grid[i];
        for(int j=0; j<n; j++) {  // 依序讀取這行中的字元
            char ch = grid[i][j];
            if (ch == '*') bomb.push_back(make_pair(i, j));  // ch 是炸彈,位置 (i, j) 加入 bomb
        }
    }
    for(auto b : bomb) {  // 讀取炸彈位置 (i, j),將十字方向上的位置皆改成 *
        int i = b.first, j = b.second;
        for(int c=j; c>=0; c--) grid[i][c] = '*';
        for(int c=j; c<n; c++) grid[i][c] = '*';
        for(int r=i; r>=0; r--) grid[r][j] = '*';
        for(int r=i; r<n; r++) grid[r][j] = '*';
    }
    for(string row : grid) cout << row << "\n";  // 印出答案
    return 0;
}


沒有留言:

張貼留言