蛇形方阵

题目描述

给出一个不大于 $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;
}