#pragma GCC optimize("Ofast") #pragma GCC target("avx2") #pragma GCC optimize("unroll-loops") #include // #include using namespace std; using namespace chrono; unsigned int rnd() { const unsigned long long C = 0xcafef00dd15ea5e5ULL; static unsigned long long X = C; X *= C; return (X >> 32); } static double rand01() { return (rnd() + 0.5) * (1.0 / UINT_MAX); } static int randint(int N) { // [0, N) return ((unsigned long long)rnd() * N) >> 32; } std::chrono::_V2::system_clock::time_point startClock; double gettime() { return (double)duration_cast(system_clock::now() - startClock) .count() * 1e-6; } #define N 20 int A[N][N]; int T; bool used[N][N]; int di[4] = {1, -1, 0, 0}; int dj[4] = {0, 0, 1, -1}; int best_ans_x[N * N], best_ans_y[N * N]; int now_ans_x[N * N], now_ans_y[N * N]; int now_score = 0; int best_score = 0; void solve(int i, int j, int depth) { if (gettime() > 1.9) { return; } if (depth == T - 1) { if (now_score > best_score) { best_score = now_score; for (int k = 0; k < T; k++) { best_ans_x[k] = now_ans_x[k]; best_ans_y[k] = now_ans_y[k]; } } return; } vector> candidates; for (int dir = 0; dir < 4; dir++) { int ni = i + di[dir]; int nj = j + dj[dir]; if (ni < 0 || nj < 0 || ni >= N || nj >= N) continue; if (used[ni][nj]) continue; candidates.emplace_back(-A[ni][nj], ni, nj); } sort(candidates.begin(), candidates.end()); for (int i = 0; i < (int)candidates.size(); i++) { int ni = get<1>(candidates[i]); int nj = get<2>(candidates[i]); now_ans_x[depth + 1] = ni; now_ans_y[depth + 1] = nj; used[ni][nj] = true; now_score += A[ni][nj]; solve(ni, nj, depth + 1); used[ni][nj] = false; now_score -= A[ni][nj]; } } int main() { startClock = system_clock::now(); cin.tie(nullptr); ios::sync_with_stdio(false); int N_; cin >> N_ >> T; for (int i = 0; i < N_; i++) { for (int j = 0; j < N_; j++) { cin >> A[i][j]; } } for (int i = 0; i < N_; i++) { for (int j = 0; j < N_; j++) { used[i][j] = 0; } } now_ans_x[0] = 0; now_ans_y[0] = 0; used[0][0] = true; now_score = A[0][0]; solve(0, 0, 0); cout << T << endl; for (int i = 0; i < T; i++) { cout << best_ans_x[i] << " " << best_ans_y[i] << "\n"; } }