#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'; } } pair best_point = {-1, -1}; double best_score = 1e9; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { double score = 0; for (int t = 0; t < 5; t++) { vector> is_dry(N, vector(N, false)); for (int x = 0; x < N; x++) { for (int y = 0; y < N; y++) { if (grid[x][y] == 0) continue; if (x == i || y == j) continue; is_dry[x][y] = (rand() % 10 < grid[x][y]); } } vector> visited(N, vector(N, false)); for (int x = 0; x < N; x++) { for (int y = 0; y < N; y++) { if (visited[x][y] || !is_dry[x][y]) continue; queue> q; q.push({x, y}); visited[x][y] = true; int size = 0; while (!q.empty()) { auto [cx, cy] = q.front(); q.pop(); size++; for (int d = 0; d < 4; d++) { int nx = cx + DX[d]; int ny = cy + DY[d]; if (nx < 0 || nx >= N || ny < 0 || ny >= N) continue; if (visited[nx][ny] || !is_dry[nx][ny]) continue; visited[nx][ny] = true; q.push({nx, ny}); } } score += size * size; } } } score /= 5; if (score < best_score) { best_score = score; best_point = {i, j}; } } } vector> ans; for (int i = 0; i < N; i++) { int j = best_point.second; if (grid[i][j] > 0) { ans.push_back({i, j}); } } for (int j = 0; j < N; j++) { if (j == best_point.second) continue; int i = best_point.first; if (grid[i][j] > 0) { ans.push_back({i, j}); } } cout << ans.size() << endl; for (int i = 0; i < ans.size(); i++) { cout << ans[i].first << " " << ans[i].second << endl; } }