蛇形矩阵进阶
蛇形方阵
题目描述
给出一个不大于 $9$ 的正整数 $n$,输出 $n\times n$ 的蛇形方阵。从左上角填上 $1$ 开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用 $3$ 个字符,前面使用空格补齐。
输入格式
输入一个正整数 $n$,含义如题所述。
输出格式
输出符合题目要求的蛇形矩阵。
样例输入 #1
4
样例输出 #1
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
提示
数据保证,$1 \leq n \leq 9$。
AC正解:
#include<bits/stdc++.h>
using namespace std;
long long a[100][100],n,num=1,x=1,y=0;
int main(){
cin>>n;
while(num<=n*n){
while(y<n&&a[x][y+1]==0)a[x][++y]=num++;
while(x<n&&a[x+1][y]==0)a[++x][y]=num++;
while(y>1&&a[x][y-1]==0)a[x][--y]=num++;
while(x>1&&a[x-1][y]==0)a[--x][y]=num++;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
printf("%3d",a[i][j]);
cout<<endl;
}
return 0;
}
进阶:螺旋矩阵
题目描述 |
---|
一个 $n$ 行 $n$ 列的螺旋矩阵可由如下方法生成:从矩阵的左上角(第 $1$ 行第 $1$ 列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 $1, 2, 3, … , n^2$,便构成了一个螺旋矩阵。下图是一个 $n = 4$ 时的螺旋矩阵。 |
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
现给出矩阵大小 $n$ 以及 $i$ 和 $j$,请你求出该矩阵中第 $i$ 行第 $j$ 列的数是多少。
输入格式 |
---|
共一行,包含三个整数 $n$, $i$, $j$,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。 |
输出格式 |
---|
一个整数,表示相应矩阵中第 $i$ 行第 $j$ 列的数。 |
样例输入 #1
4 2 3
样例输出 #1
14
提示 |
---|
对于 $50%$ 的数据,$1 \leqslant n \leqslant 100$; |
对于 $100%$ 的数据,$1 \leqslant n \leqslant 30,000,1 \leqslant i \leqslant n,1 \leqslant j \leqslant n$。 |
正解1
//递归写法
#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL n,x,y;
int f(int n,int x,int y){
if(x==1)return y;
if(y==n)return n+x-1;
if(x==n)return 3*n-2-y+1;
if(y==1)return 4*n-4-x+2;
return f(n-2,x-1,y-1)+4*(n-1);
}
int main(){
cin>>n>>x>>y;
cout<<f(n,x,y)<<endl;
return 0;
}
正解2:
#include<bits/stdc++.h>
#define LL long long
#define check if(x==xx&&y==yy){cout<<num;return 0;}
using namespace std;
LL n,xx,yy,x=1,y,num;
int main(){
cin>>n>>xx>>yy;
while(n){
if((xx==x&&yy>y&&yy<=y+n)||(xx==x+n-1&&yy>y&&yy<=y+n)||(xx>=x&&xx<=x+n-1&&yy==y+1)||(xx>=x&&xx<=x+n-1&&yy==y+n)){
for(int i=1;i<=n;++i){y++;num++;check;}
for(int i=1;i<=n-1;++i){x++;num++;check;}
for(int i=1;i<=n-1;++i){y--;num++;check;}
for(int i=1;i<=n-2;++i){x--;num++;check;}
}else{num+=4*n-4;x++;y++;}
n-=2;
}
return 0;
}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 zhengqingyu0311!