螺旋矩阵
作者:互联网
从左上角填上 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