#include // #pragma GCC target("avx2") // #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") #include using namespace std; using namespace std::chrono; const int DX[] = {0, 1, 0, -1}; const int DY[] = {1, 0, -1, 0}; const char DIR[] = {'R', 'D', 'L', 'U'}; int N, K; vector> grid; int main() { auto current_time = high_resolution_clock::now(); cin >> N >> K; grid = vector>(N, vector(N)); for (int i = 0; i < N; i++) { string s; cin >> s; for (int j = 0; j < N; j++) { grid[i][j] = s[j] - '0'; } } vector> count(N, vector(N, 0)); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (grid[i][j] == 0) continue; for (int t = 0; t < 16; t++) { deque> q; q.push_back({i, j}); vector> visited(N, vector(N, false)); visited[i][j] = true; while (!q.empty()) { auto [x, y] = q.front(); q.pop_front(); if (rand() % 10 <= grid[x][y] - 1) { count[x][y]++; } else { continue; } for (int d = 0; d < 4; d++) { int nx = x + DX[d]; int ny = y + DY[d]; if (nx < 0 || nx >= N || ny < 0 || ny >= N) continue; if (visited[nx][ny]) continue; if (grid[nx][ny] == 0) continue; visited[nx][ny] = true; q.push_back({nx, ny}); } } } } } vector> ans; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { ans.push_back({count[i][j], i * N + j}); } } sort(ans.rbegin(), ans.rend()); cout << K << endl; for (int i = 0; i < K; i++) { cout << ans[i].second / N << " " << ans[i].second % N << endl; } }