#55160: AC 1ms 3.5mB


nch00sek (nch00sek)


#include <climits>
#include <cstddef>
#include <ios>
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m, x, y;

int count = 0; // 累積的數值
cin >> n >> m;
vector<vector<int>> map(n, vector<int>(m)); // 地圖資料
vector<vector<bool>> walked(n, vector<bool>(m, false)); // 是否走過
int start = INT_MAX;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> map[i][j];
if (map[i][j] < start) // 找起點,他會從最小的出發
{
start = map[i][j];
x = i;
y = j;
}
}
}
int dr[4] = {-1, 0, 1, 0}; // 加上方向用
int dc[4] = {0, 1, 0, -1};
count += map[x][y]; // 起點的值也要加上去
while (true) //
{

walked[x][y] = true;
int min = INT_MAX;
int new_x;
int new_y;
for (int i = 0; i < 4; i++) {

if (x + dr[i] < n && x + dr[i] > -1 && y + dc[i] < m && y + dc[i] > -1 &&
walked[x + dr[i]][y + dc[i]] == false) {
if (map[x + dr[i]][y + dc[i]] < min) {
min = map[x + dr[i]][y + dc[i]];

new_x = x + dr[i];
new_y = y + dc[i];
}
}
}
if (min == INT_MAX) // 四周沒有比他小的
{
break;
}
count += min;
x = new_x;
y = new_y;
}
cout << count << endl;
}