#pragma region header #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // =============================================================== //using系 #pragma region header using namespace std; using ll = long long; using vl = vector; using vvl = vector>; using vvi = vector>; using Graph = vvi; using vs = vector; using vc = vector; using vcc = vector>; using vm = vector; using vmm = vector>; using pii = pair; using psi = pair; using ld = long double; using ull = unsigned long long; using ui = unsigned int; using qul = queue; using pql = priority_queue; using kaage = priority_queue, greater>; int dx[] = { 1,0,-1,0 }; int dy[] = { 0,1,0,-1 }; constexpr ll mod = 1e9 + 7; #pragma endregion // ======================================================================== //define系 //#define int long long #define rep(i, n) for(ll i = 0; i < n; i++) #define REP(i, n) for(ll i = 1; i <= n; i++) // ======================================================================== #pragma region header ll gcd(ll a, ll b) { if (a % b == 0) { return(b); } else { return(gcd(b, a % b)); } } //最大公約数 ll lcm(ll a, ll b) { return a * b / gcd(a, b); } //最小公倍数 ll box(double a) { ll b = a; return b; } //切り捨て ll fff(double a) { ll b = a + 0.5; return b; } //四捨五入 ll mch(ll n) { if (n == 1) return 1; else return n * mch(n - 1); } //1から整数nまでの階乗を出す(INFで割っていない) bool prime(ll a)//素数判定、primeならtrue,違うならfalse { if (a < 2) return false; else if (a == 2) return true; else if (a % 2 == 0) return false; double m = sqrt(a); for (int i = 3; i <= m; i += 2) { if (a % i == 0) { return false; } } // 素数である return true; } //素数判定 ll modpow(ll a, ll n, ll mod) { ll hi = 1; while (n > 0) { if (n & 1) hi = hi * a % mod; a = a * a % mod; n >>= 1; } return hi; } //いろいろやります(ただの前座) ll mg(ll a, ll mod) { return modpow(a, mod - 2, mod); } //割り算の10^9+7等対策で逆元を出します #pragma endregion #pragma endregion // ======================================================================== #pragma region header //ある程度のテンプレ(いじって使う) //これとBFS、あとその時その時で使うものはここに書く vector seens; void dfs(const Graph& G, int v) { seens[v] = true; // v を訪問済にする // v から行ける各頂点 next_v について for (auto next_v : G[v]) { if (seens[next_v]) continue; // next_v が探索済だったらスルー dfs(G, next_v); // 再帰的に探索 } } // ======================================================================== #pragma endregion /*signed*/ int main() { ll n; cin >> n; vector> d(n, vector(n)); ll a = n / 2 + 1; for (ll i = 0; i < n; i++) { if (i % 2 == 0) { d[0][i] = i / 2 + 1; } else d[0][i] = a + (i / 2) + 1; } for (ll i = 1; i < n; i++) { if (i % 2 == 0) { d[i][n - 1] = a + (i / 2); } else { d[i][n - 1] = i / 2 + 1; } } for (int i = 1; i < n; i++) { for (int j = 0; j < n - 1; j++) { d[i][j] = d[i - 1][j + 1]; } } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << d[i][j]; if (j != n - 1) { cout << ' '; } else cout << endl; } } return 0; }