Description |
对于给定的一个数n,要你打印n*n的螺旋矩阵。 比如n=3时,输出: 1 2 3 |
Input |
多组测试数据,每个测试数据包含一个整数n(1<=n<=32) |
Output |
对于每组测试数据,输出一个n*n的螺旋矩阵,定义在题目描述里。 在一组测试数据中,每个数占的字符宽度是该组数据中最大的数位数加1,比如3*3的螺旋矩阵,最大值是9,那么每个数就要占2个字符宽度。 两组测试数据之间用一个空行隔开。 |
Sample Input |
1 |
Sample Output |
1 1 2 |
比较经典的趣味题,算法本身不难,但此题设定最坑爹的是格式,要求动态调整字符宽度;要求的两组数据之间用空行隔开,其实是叫你从第二组开始在开头放一个空行,不是在每组测试之后放空行,这就要用一个little trick.
#include <iostream> using namespace std;
const int size = ;
int main()
{
int n;
bool space = false;
while(cin>>n){
if(space)
cout<<endl;
int a[size][size] = {};
int x=,y=;
int total=a[x][y]=;
int max = n*n;
while(total<max){
while(y<n- && !a[x][y+]) a[x][++y] = ++total;
while(x<n- && !a[x+][y]) a[++x][y] = ++total;
while(y->= && !a[x][y-]) a[x][--y] = ++total;
while(x->= && !a[x-][y]) a[--x][y] = ++total;
}
int width;
if(max<) width = ;
if(max>=&&max<) width = ;
if(max>=&&max<) width = ;
if(max>=&&max<) width = ;
for(int i=;i<n;i++){
for(int j=;j<n;j++)
printf("%*d",width,a[i][j]);
cout<<endl;
}
space = true;
}
return ;
}
值得注意的是,这个是模拟算法,题目改了的话时间复杂度会很恐怖,得用算的