#include #include #include #include #include #include #include using namespace std; int N; int T; vector> A; pair Dir[4] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; bool is_in(int x, int y) { return x >= 0 && x < N && y >= 0 && y < N; } int simulate(vector> &path) { int x = rand() % N; int y = rand() % N; int reward = A[y][x]; path.push_back({x, y}); vector> visited(N, vector(N, false)); visited[y][x] = true; int error_count = 0; for (int i = 0; i < T;) { int dir = rand() % 4; int nx = x + Dir[dir].first; int ny = y + Dir[dir].second; if (!is_in(nx, ny) || visited[ny][nx]) { error_count++; if (error_count >= 10) { return reward; } continue; } path.push_back({nx, ny}); visited[ny][nx] = true; reward += A[ny][nx]; x = nx; y = ny; i++; error_count = 0; } return reward; } int main() { auto start = chrono::system_clock::now(); cin >> N >> T; A = vector>(N, vector(N)); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { cin >> A[i][j]; } } fprintf(stderr, "input finished\n"); int max_s = 0; vector> max_path; for (;;) { for (int i = 0; i < 100; i++) { vector> path; int res = simulate(path); fprintf(stderr, "res: %d\n", res); if (res > max_s) { max_s = res; // copy(path.begin(), path.end(), max_path.begin()); max_path = path; } } auto end = chrono::system_clock::now(); double time = static_cast( chrono::duration_cast(end - start).count()); fprintf(stderr, "time: %f\n", time); if (time > 1990) { break; } } cout << max_path.size() << endl; for (int k = 0; k < max_path.size(); k++) { cout << max_path[k].first << " " << max_path[k].second << endl; } return 0; }