2310 - 方阵填数
在一个N*N的方阵中,填入1,2,……N*N个数,并要求构成如下的格式:
例如:
N=5
13 14 15 16 1
12 23 24 17 2
11 22 25 18 3
10 21 20 19 4
9 8 7 6 5
N=6
<span style="font-family:SimSun;">16 17 18 19 20 1</span>
<span style="font-family:SimSun;">15 30 31 32 21 2</span>
<span style="font-family:SimSun;">14 29 36 33 22 3</span>
<span style="font-family:SimSun;">13 28 35 34 23 4</span>
<span style="font-family:SimSun;">12 27 26 25 24 5</span>
<span style="font-family:SimSun;">11 10 9 8 7 6</span>
Input
每个测试文件只包含一组测试数据,每组输入一个N。
Output
输出构成的方阵。
Examples
Input
5
Output
13 14 15 16 1 12 23 24 17 2 11 22 25 18 3 10 21 20 19 4 9 8 7 6 5
Hint
6
-------------------------
16 17 18 19 20 1
15 30 31 32 21 2
14 29 36 33 22 3
13 28 35 34 23 4
12 27 26 25 24 5
11 10 9 8 7 6
Solution C
#include <stdio.h> int main (void) { int i, n, k, ix, iy; scanf("%d", &n); int A[n][n]; k = 0; for(i = 0; i <= n / 2; i++) { for(ix = i, iy = n - i - 1; ix < n - i - 1; ix++) { k++; A[ix][iy] = k; } for(ix = n - i - 1, iy = n - i - 1; iy > i; iy--) { k++; A[ix][iy] = k; } for(ix = n - i - 1, iy = i; ix > i; ix--) { k++; A[ix][iy] = k; } for(ix = i, iy = i; iy < n - i - 1; iy++) { k++; A[ix][iy] = k; } } if(n % 2 == 1) A[n / 2][n / 2] = ++k; for(ix = 0; ix < n; ix++) { for(iy = 0; iy < n; iy++) { if(iy > 0) printf(" "); if(A[ix][iy] < 10&&(iy == 0||A[ix][iy - 1] < 10)) printf(" "); printf("%d", A[ix][iy]); } printf("\n"); } return 0; }
Solution C++
#include <iostream> #include <string> #include <cstdio> using namespace std; int n; int map[200][200]={0}; void fill_map(int t,int l,int s) { for(int i=l+1;i<=s;i++) map[i][s]=t++; for(int i=s-1;i>=l+1;i--) map[s][i]=t++; for(int i=s-1;i>=l+1;i--) map[i][l+1]=t++; for(int i=l+2;i<=s-1;i++) map[l+1][i]=t++; if(s>=0) fill_map(t,l+1,s-1); } void print_map1() { for(int i=1;i<=n;i++) { for(int j=1;j<n;j++) printf("%2d ",map[i][j]); printf("%2d\n",map[i][n]); } } void print_map2() { for(int i=1;i<=n;i++) { for(int j=1;j<n;j++) printf("%d ",map[i][j]); printf("%d\n",map[i][n]); } } int main() { cin>>n; fill_map(1,0,n); if(n!=10) print_map1(); else print_map2(); return 0; }
Hint
6
-------------------------
16 17 18 19 20 1
15 30 31 32 21 2
14 29 36 33 22 3
13 28 35 34 23 4
12 27 26 25 24 5
11 10 9 8 7 6