#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> score(N, vector(N, 0)); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (grid[i][j] == 0) continue; deque> q; q.push_back({i, j}); vector> visited(N, vector(N, false)); vector> now_score(N, vector(N, 0)); now_score[i][j] = 0.1 * grid[i][j]; while (!q.empty()) { auto [x, y] = q.front(); q.pop_front(); if (visited[x][y]) continue; visited[x][y] = true; double p = 1.0; 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 (grid[nx][ny] == 0) continue; p *= (1.0 - now_score[nx][ny]); q.push_back({nx, ny}); } now_score[x][y] += (1.0 - p) * 0.1 * grid[x][y]; } for (int x = 0; x < N; x++) { for (int y = 0; y < N; y++) { score[x][y] += now_score[x][y]; } } } } vector> ans; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { ans.push_back({score[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; } }