#include <iostream>
#include <iomanip>
static size_t count_digits(size_t x)
{
size_t res = 0;
while (x > 0) {
++res;
x /= 10;
}
return res;
}
int main() {
const size_t coils = 7;
const size_t size = coils * 2 + 1;
const size_t digits = count_digits(size * size + 1);
for (size_t y = 0; y < size; ++y)
{
for (size_t x = 0; x < size; ++x)
{
const size_t dx = x > coils ? x - coils : coils - x;
const size_t dy = y > coils ? y - coils : coils - y;
const size_t coil = std::max(dx, dy);
const size_t side_size = coil * 2;
const size_t coil_start = coil > 0 ? (coil * 2 - 1) * (coil * 2 - 1) + 1 : 1;
// quadrants: 0 - right, 1 - bottom, 2 - left, 3 - top
size_t quadrant = 0, offset = 0;
if (x > coils && y >= size - x && y <= x) { quadrant = 0; offset = y - (size - x); }
if (y > coils && x >= size - y - 1 && x < y) { quadrant = 1; offset = y - x - 1; }
if (x < coils && y >= x && y < size - x - 1) { quadrant = 2; offset = (size - x - 2) - y; }
if (y < coils && x > y && x < size - y) { quadrant = 3; offset = x - y - 1; }
const size_t n = coil_start + side_size * quadrant + offset;
std::cout << std::setw(digits) << n << " ";
}
std::cout << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KCnN0YXRpYyBzaXplX3QgY291bnRfZGlnaXRzKHNpemVfdCB4KQp7CglzaXplX3QgcmVzID0gMDsKCXdoaWxlICh4ID4gMCkgewoJCSsrcmVzOwoJCXggLz0gMTA7Cgl9CglyZXR1cm4gcmVzOwp9CgppbnQgbWFpbigpIHsKCWNvbnN0IHNpemVfdCBjb2lscyA9IDc7Cgljb25zdCBzaXplX3Qgc2l6ZSA9IGNvaWxzICogMiArIDE7CiAgICBjb25zdCBzaXplX3QgZGlnaXRzID0gY291bnRfZGlnaXRzKHNpemUgKiBzaXplICsgMSk7CgogICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBzaXplOyArK3kpCiAgICB7CiAgICAJZm9yIChzaXplX3QgeCA9IDA7IHggPCBzaXplOyArK3gpCiAgICAJewogICAgCQljb25zdCBzaXplX3QgZHggPSB4ID4gY29pbHMgPyB4IC0gY29pbHMgOiBjb2lscyAtIHg7CiAgICAJCWNvbnN0IHNpemVfdCBkeSA9IHkgPiBjb2lscyA/IHkgLSBjb2lscyA6IGNvaWxzIC0geTsKICAgIAkJY29uc3Qgc2l6ZV90IGNvaWwgPSBzdGQ6Om1heChkeCwgZHkpOwogICAgCQkKICAgIAkJY29uc3Qgc2l6ZV90IHNpZGVfc2l6ZSA9IGNvaWwgKiAyOwogICAgCQljb25zdCBzaXplX3QgY29pbF9zdGFydCA9IGNvaWwgPiAwID8gKGNvaWwgKiAyIC0gMSkgICogKGNvaWwgKiAyIC0gMSkgKyAxIDogMTsKICAgIAkJCiAgICAJCS8vIHF1YWRyYW50czogMCAtIHJpZ2h0LCAxIC0gYm90dG9tLCAyIC0gbGVmdCwgMyAtIHRvcAogICAgCQlzaXplX3QgcXVhZHJhbnQgPSAwLCBvZmZzZXQgPSAwOwogICAgCQlpZiAoeCA+IGNvaWxzICYmIHkgPj0gc2l6ZSAtIHggJiYgeSA8PSB4KSB7IHF1YWRyYW50ID0gMDsgb2Zmc2V0ID0geSAtIChzaXplIC0geCk7IH0KICAgIAkJaWYgKHkgPiBjb2lscyAmJiB4ID49IHNpemUgLSB5IC0gMSAmJiB4IDwgeSkgeyBxdWFkcmFudCA9IDE7IG9mZnNldCA9IHkgLSB4IC0gMTsgfQogICAgCQlpZiAoeCA8IGNvaWxzICYmIHkgPj0geCAmJiB5IDwgc2l6ZSAtIHggLSAxKSB7IHF1YWRyYW50ID0gMjsgIG9mZnNldCA9IChzaXplIC0geCAtIDIpIC0geTsgfQogICAgCQlpZiAoeSA8IGNvaWxzICYmIHggPiB5ICYmIHggPCBzaXplIC0geSkgeyBxdWFkcmFudCA9IDM7IG9mZnNldCA9IHggLSB5IC0gMTsgfQogICAgCQkKICAgIAkJY29uc3Qgc2l6ZV90IG4gPSBjb2lsX3N0YXJ0ICsgc2lkZV9zaXplICogcXVhZHJhbnQgKyBvZmZzZXQ7CiAgICAJCQogICAgCQlzdGQ6OmNvdXQgPDwgc3RkOjpzZXR3KGRpZ2l0cykgPDwgbiA8PCAiICI7CiAgICAJfQogICAgCXN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgICB9CiAgICAKCXJldHVybiAwOwp9