1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| #include <iostream> #include <vector> #define mk make_pair #define x first #define y second using namespace std; const int N = 500;
using PII = pair<int, int>;
int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1};
int n, m;
int g[N][N];
bool vis[N][N];
int ans_sum = -0x3f3f;
vector<PII>tree, ans;
bool isRun(int bx, int by) { return (bx >= 0 && bx < n && by >= 0 && by < m && !vis[bx][by]); }
void DFS(int x, int y, int sum) { if (x == n - 1 && y == m - 1) { if (ans_sum < sum) { ans_sum = sum; ans = tree; } return ; }
vis[x][y] = true;
for (int i = 0; i < 4; ++i) { int bx = x + dx[i]; int by = y + dy[i]; if (isRun(bx, by)) { vis[bx][by] = true; tree.emplace_back(mk(bx, by));
DFS(bx, by, sum + g[bx][by]);
tree.pop_back(); vis[bx][by] = false; } } return ; }
int main() {
cin >> n >> m; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { cin >> g[i][j]; } }
tree.emplace_back(mk(0, 0));
DFS(0, 0, g[0][0]);
for (auto i : ans) { cout << i.x + 1 << ' ' << i.y + 1 << endl; }
return 0; }
|