其他分享
首页 > 其他分享> > 螺旋矩阵

螺旋矩阵

作者:互联网

从左上角填上 1 开始,顺时针方向依次填入数字
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

大一的时候助教出的这道题目,当时我感觉好难呀,这是人做的题目嘛?,那时刚学二维数组,对这道题目手足无措,也是想了好久才想出来。最近刷题还能碰到这个题目,以及变形题目,看来这个题还是比较普遍的,那么今天就写一下题解。

题目倒是很好理解呀,就是顺时针从外到内填数。思考一下我们肯定是不可能边赋值边输出的,那么我们就得建立一个二维数组存一下每个位置的数。我们看一下以输入4为例的结果(上面有):
我们肯定是分成4个组来进行赋值的:
左上→右上
↑ 、、、 ↓
左下←右下
我们就先看外面最后一层,会发现其实每组只赋值3个元素就行,这个的意思就是:
左上到右上进行第1行第1-3列的赋值 1 2 3
右上到右下进行第4列第1-3行的赋值 4 5 6
右下到左下进行第4行第4-2列的赋值 7 8 9
左下到左上进行第1列第4-2行的赋值 10 11 12

1 2 3 4
5
12 6
11
10 9 8 7

因此我们就可以发现转一圈正好形成一个闭环,第二层的话再形成一个闭环,一直到值为4*4结束,然后打印二维数组即可。

#include<bits/stdc++.h>
using namespace std;
int a[10][10];//每个点的值的为0
int main(){
    int n,ans=1;
    int x=1,y=1;
    scanf("%d",&n);
    a[x][y]=1;
    while(n*n>ans){
    
    	//这里解释一下!a[x][y+1],以左上到右上为例
    	//y<n是用来控制外围的范围的,也就是最外圈
    	//我们外层了值以后执行第二层的话,最外层的已经赋上大于0的值
    	//我们碰到大于0的数就说明走到“头”了,就跳出循环
    	//例如n=4,我们已经走完外圈,走里圈的话,走到了【2,3】的位置
    	//发现【2,4】已经有值了,我们就跳出循环,开始往下走
    	
        while(y<n&&!a[x][y+1]){//左上到右上
            a[x][y++]=ans++;
        }
        while(x<n&&!a[x+1][y]){//右上到右下
            a[x++][y]=ans++;
        }
        while(y>1&&!a[x][y-1]){//右下到左下
            a[x][y--]=ans++;
        }
        while(x>1&&!a[x-1][y]){/左下到左上
            a[x--][y]=ans++;
        }
    }
    a[x][y]=ans;//由于ans是从1开始的,
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            printf("%3d",a[i][j]);//占3个字符右对齐输出
        }
        puts("");//相当于回车
    }
    return 0;
}

洛谷有原题

标签:10,题目,螺旋,int,cen,矩阵,ans,赋值
来源: https://blog.csdn.net/weixin_44417475/article/details/104609700