#include #include #include #include #include #define MAXN 200 using std::map; using std::abs; using std::vector; using std::priority_queue; int N, R, K; int field[MAXN][MAXN]; int sums[MAXN][MAXN]; struct entry { int val, x, y; public: entry(int val, int x, int y) { this->val = val; this->x = x; this->y = y; } bool operator<(const entry &b) const { return val < b.val; } }; priority_queue pq; int hits = 0; vector queens; void read() { FILE *fp = freopen("queens.in", "r", stdin); scanf("%d %d %d", &N, &R, &K); for(int i = 0;i < N;i++) for(int j = 0;j < N;j++) scanf("%d", &field[i][j]); fclose(fp); } void output() { FILE *fp = freopen("queens.out", "w", stdout); for(int i = 0;i < queens.size();i++) printf("%d %d\n", queens[i].x+1, queens[i].y+1); /*int sum = 0; for(int i = 0;i < queens.size();i++) sum += queens[i].val; printf("%d\n", sum);*/ fclose(fp); } inline bool inBounds(const int &i) { return i >= 0 && i < N; } int computeSum(int x, int y, int dirx, int diry, map &mp) { int sum = 0; x -= R*dirx; y -= R*diry; for(int i = 0;i < 2*R+1;++i) if(inBounds(x + i*dirx) && inBounds(y + i*diry)) { int val = field[y + i*diry][x + i*dirx]; sum += val; if(mp.find(val) != mp.end()) mp[val] = mp[val] + 1; else mp[val] = 0; } return sum; } void computeSums() { map mp; for(int i = 0;i < N;++i) for(int j = 0;j < N;++j) { mp.clear(); int sum = 0; sum += computeSum(j, i, 1, 0, mp); sum += computeSum(j, i, 1, 1, mp); sum += computeSum(j, i, 0, 1, mp); sum += computeSum(j, i, -1, 1, mp); int mx = 0, mi; for(auto it = mp.cbegin(); it != mp.cend();it++) { if(it->second > mx) { mx = it->second; mi = it->first; } } sums[i][j] = sum * mi; pq.push(entry(sums[i][j], j, i)); } } inline bool isHit(int x, int y, entry e) { int dx = abs(x - e.x); int dy = abs(y - e.y); if(x == e.x && dy <= R) return true; if(y == e.y && dx <= R) return true; if(dx == dy && dx <= R) return true; return false; } int getHits(int x, int y) { int h = 0; for(int i = 0;i < queens.size();++i) { if(isHit(x, y, queens[i])) ++h; } return h; } int main() { read(); computeSums(); while(!pq.empty()) { entry e = pq.top(); pq.pop(); int h = getHits(e.x, e.y); if(hits + h <= K) { hits += h; queens.push_back(e); } } output(); return 0; }