日期: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;
}
沒有留言:
張貼留言