結果
| 問題 | 
                            No.697 池の数はいくつか
                             | 
                    
| ユーザー | 
                             | 
                    
| 提出日時 | 2023-03-31 14:29:33 | 
| 言語 | C++17  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 2,183 ms / 6,000 ms | 
| コード長 | 1,699 bytes | 
| コンパイル時間 | 1,092 ms | 
| コンパイル使用メモリ | 85,592 KB | 
| 最終ジャッジ日時 | 2025-02-11 19:36:33 | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 32 | 
ソースコード
#include<iostream>
#include<vector>
#include<stack>
int main() {
    int H, W;
    std::cin >> H >> W;
    std::vector<std::vector<bool>> A(H, std::vector<bool>(W));
    for (int h = 0; h < H; ++h) {
        for (int w = 0; w < W; ++w) {
            int a;
            std::cin >> a;
            A.at(h).at(w) = bool(a);
        }
    }
    const std::vector<std::pair<int, int>> dhw = {{0,  1},
                                                  {1,  0},
                                                  {0,  -1},
                                                  {-1, 0}};
    std::vector<std::vector<bool>> nonvisited(H, std::vector<bool>(W, true));
    int ans = 0;
    for (int h0 = 0; h0 < H; ++h0) {
        for (int w0 = 0; w0 < W; ++w0) {
            if (A.at(h0).at(w0) && nonvisited.at(h0).at(w0)) {
                ans++;
                std::stack<std::pair<int, int>> stk;
                stk.emplace(h0, w0);
                while (!stk.empty()) {
                    const auto [h, w] = stk.top();
                    stk.pop();
                    nonvisited.at(h).at(w) = false;
                    for (const auto &[dh, dw]: dhw) {
                        const int hdh = h + dh;
                        const int wdw = w + dw;
                        if (0 <= hdh
                            && hdh < H
                            && 0 <= wdw
                            && wdw < W
                            && A.at(hdh).at(wdw)
                            && nonvisited.at(hdh).at(wdw)) {
                            stk.emplace(hdh, wdw);
                        }
                    }
                }
            }
        }
    }
    std::cout << ans << std::endl;
}