程式碼
#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;
}