アメーバ
問題
B – アメーバ
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…
記録
- 2022/3/5 実装で引く処理を忘れる。
解法
- すべてのマスを調べる。
- 今見ているマスの上下左右のすべてのマスの最小値がそのマスの値になる。
コード例
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using ll = long long; using P = pair<int, int>; #define rep(i, n) for(int i = 0; i < (n); ++i) // using mint = modint998244353; // using mint = modint1000000007; // const int mod = 1000000007; // const ll INF = 1LL << 60; // const int INF = 1001001001; int main() { int N, M; cin >> N >> M; vector<string> b(N); rep(i, N) { cin >> b[i]; } vector<vector<int>> v(N, vector<int>(M)); rep(i, N) { rep(j, M) { v[i][j] = int(b[i][j] - '0'); } } vector<int> dy = {-1, 0, 1, 0}; vector<int> dx = {0, -1, 0, 1}; vector<vector<int>> ans(N, vector<int>(M)); for(int i = 1; i < N - 1; ++i) { for(int j = 1; j < M - 1; ++j) { int mn = 10; for(int k = 0; k < 4; ++k) { int nh = i + dy[k]; int nw = j + dx[k]; mn = min(mn, v[nh][nw]); } ans[i][j] = mn; for(int k = 0; k < 4; ++k) { int nh = i + dy[k]; int nw = j + dx[k]; v[nh][nw] -= mn; } } } rep(i, N) { rep(j, M) { cout << ans[i][j]; } cout << endl; } return 0; }