#41940: c++ bfs解(附解釋)


dvbdarcyvolleyball@gmail.com (no love)

學校 : 新北市私立南山高級中學
編號 : 266888
來源 : [36.229.113.115]
最後登入時間 :
2024-11-10 16:32:25
e287. 機器人的路徑 -- APCS | From: [123.252.121.18] | 發表日期 : 2024-09-12 14:39

 

程式碼

#include <bits/stdc++.h> //BFS
using namespace std;

int main() {
    int n, m, max = 1000001, ans = 0, x, y, small;
    cin >> n >> m;
    vector<vector<int>> a(n, vector<int>(m)); //建立n*m的表格記錄數字
    vector<vector<bool>> visited(n,vector<bool>(m,0)); 建立n*m的表格記錄是否被訪問過
    for(int i = 0;i < n;i++){
        for(int j = 0;j < m;j++){
            cin >> a[i][j]; //輸入數字
            if(a[i][j] < max){ //找起點
                x = i;
                y = j;
                max = a[i][j];
            }
        }
    }
    ans += a[x][y]; //要算起點
    while(true){
        visited[x][y] = true;  // 標記為已訪問
        vector<pair<int, int>> dirs = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; //建立往上下左右尋找的directions
        small = INT_MAX;
        int new_x = x, new_y = y; //紀錄最新的位置

        for (auto d : dirs){ //遍歷四個方向
            int nx = x + d.first, ny = y + d.second;
            if(nx >= 0 && ny >= 0 && nx < n && ny < m && !visited[nx][ny]){ //不超出邊解且沒被訪問過
                if(a[nx][ny] < small){
                    small = a[nx][ny];
                    new_x = nx;
                    new_y = ny;
                }
            }
        }
        if(small == INT_MAX){ //small沒被改代表周圍沒有比他小的,就跳出輸出答案
            break;
        }
        ans += small;  //找到最小的並更新ans還有目前位置
        x = new_x;
        y = new_y;
    }
    cout << ans << endl;
}

 
ZeroJudge Forum