// R36471603 #include using namespace std; int n, k, a[15][15], ax, ay; int main() { k = ax = 1; scanf("%d", &n); /** * ax, ay+1 -> 右侧 * ax, ay-1 -> 左侧 * ax+1, ay -> 下方 * ax-1, ay -> 上方 * * 0 --- 1 ---------- ay ----------> n * | +------+------+------+------+------+ * 1 | | | ax-1 | | | * | | | | ay | | | * | +------+------+------+------+------+ * a | | ax | ax | ax | | * x | | ay-1 | ay | ay+1 | | * | +------+------+------+------+------+ * | | | | ax+1 | | | * | | | | ay | | | * | +------+------+------+------+------+ * | | | | | | | * | | | | | | | * | +------+------+------+------+------+ * | | | | | | | * n | | | | | | n * +------+------+------+------+------+ * n */ while (k <= n * n) { while (ay < n && !a[ax][ay + 1]) { // 右侧 不过边界 && 未填数 a[ax][++ay] = k++; } while (ax < n && !a[ax + 1][ay]) { // 下方 不过边界 && 未填数 a[++ax][ay] = k++; } while (ay > 1 && !a[ax][ay - 1]) { // 左侧 不过边界 && 未填数 a[ax][--ay] = k++; } while (ax > 1 && !a[ax - 1][ay]) { // 上方 不过边界 && 未填数 a[--ax][ay] = k++; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { printf("%3d", a[i][j]); } printf("\n"); } return 0; }