螺旋方阵
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 57 Solved: 21
[ Submit][ Status][ Web Board]
Description
在数学中,我们学习过矩阵,对一些矩阵的性质也做了研究。在程序设计课程中,曾经编程处理过矩阵中的鞍点,打印过魔方阵,现在又有一新的矩阵,我们把它叫螺旋方阵,螺旋的方式有两种,一种是从方阵中心数据由小到大向外旋转,一种是从左上角开始,数据由小到大向内旋转,现在请你编一个程序,实现方阵从小到大,打印出第二种方阵来。
Input
输入只有1行,即方阵的高度h(1≤h≤20)。
Output
在屏幕上输出满足条件的螺旋方阵,每个数据占有5位宽度,每行数字之间打印一空行。
Sample Input
6
Sample Output
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
以前觉得很难最近突然顿悟是真的简单
# include <iostream>
# include <cstdio>
# include <cmath>
# include <set>
# include <map>
# include <algorithm>
# include <functional>
# include <string>
# include <numeric>
# include <cstdio>
using
namespace
std;
int
a[20][20];
void
f(
int
left,
int
right,
int
up,
int
down,
int
V)
{
int
i ,j ,k ,l;
if
(left<=right)
//注意递归的边界是left<=right 不要把if写成while造成死循环
{
for
(i = left;i<=right;i++)
a[up][i] = V++;
for
(j = up+1;j<=down;j++)
a[j][right] = V++;
for
(k = right-1;k>=left;k--)
a[down][k] = V++;
for
(l = down-1;l>up;l--)
a[l][left] = V++;
f(left+1,right-1,up+1,down-1,V);
}
}
int
main()
{
int
n,m,i,j;
while
(
scanf
(
"%d"
,&n)!=EOF)
{
f(1,n,1,n,1);
for
(i = 1;i<=n;i++)
{
for
(j = 1;j<n;j++)
printf
(
"%5d"
,a[i][j]);
printf
(
"%5d\n"
,a[i][j]);
}
printf
(
"\n"
);
}
return
0;
}