前言
还有4天就要期末考啦哈哈,这道题我捣鼓了半天只会穷举了,分能捞一点是一点,菜菜菜菜
向大神 kkzzjx 学习,我又模仿了一遍:
2022-1-12 LeetCode 螺旋矩阵_kkzzjx-CSDN博客
题干
问题描述
螺旋方阵是指一个呈螺旋状的矩阵,它的左上角元素为1,由第一行开始按从左到右,从上到下,从从右向左,从下到上的顺序递增填充矩阵,直到矩阵填充完毕,下图所示是一个5*5阶的螺旋方阵。输入螺旋方阵的阶数N,按行输出该螺旋方阵。
输入说明
输入一个正整数N(1<N<=100)。
输出说明
逐行输出N阶螺旋方阵的元素,元素之间用空格分隔。
输入样例
6
输出样例
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
解析
关键
- 每个方位走的步数:os表示,注意:走完一轮要 -2(对同行(列)来说,左右(上下)都减少了一个位置)
- 起始点的确定:四个方位(→↓←↑)走完一轮后,起始点沿右下对角线移动一个位置,注意:如果n为奇数,还要额外赋值给最后一个位置
- 用while循环: 保证有位置可挪 用for循环:已知步数
解答
//10-28 18min
#include<stdio.h>
int main(){int n,i=0,j=0,si=0,sj=0,c=1,a[100][100];scanf("%d",&n);int os=n-1;while(os>0){//rightfor(j=sj;j<sj+os;++j){a[i][j]=c;c++;}//downfor(i=si;i<si+os;++i){a[i][j]=c;c++;}//leftfor(;j>sj;--j){a[i][j]=c;c++;}//upfor(;i>si;--i){a[i][j]=c;c++;}i++;j++;si++;sj++;os-=2;}if(n%2!=0){a[i][j]=n*n;}for(i=0;i<n;i++){for(j=0;j<n;j++){if(j!=n-1) printf("%d ",a[i][j]);else printf("%d\n",a[i][j]);}}return 0;
}
拓展
XDOJ2018期末部分(含螺旋矩阵)_kkzzjx-CSDN博客
祝我们好运~