螺旋矩阵
问题描述
一个 nnn 行 nnn 列的螺旋矩阵可由如下方法生成:
从矩阵的左上角(第 111 行第 111 列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入 111, 222 , 333, … , nnn ,便构成了一个螺旋矩阵。
下图是一个 n = 4 时的螺旋矩阵。
输入格式
输入共一行,包含三个整数 n,i,jn,i,jn,i,j ,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。
输出格式
输出一个整数,表示相应矩阵中第 iii 行第 jjj 列的数。
Sample Input
4 2 3
Sample Output
14
思路如下:
螺旋矩阵的输入:
输入方针从外层到里层,即至少需要循环层数的一半(当层数为偶数时),当层数为奇数时,最内层为n*n
当矩阵的方向为向右,即纵坐标不变,横坐标+1;
当矩阵的方向为向下,即横坐标不变,纵坐标+1;
当矩阵的方向为向左,即纵坐标不变,横坐标-1;
当矩阵的方向为向上,即横坐标不变,纵坐标±;
矩阵的四个顶点坐标为(0,0),(0,n-1),(n-1,n-1),
(n-1,0)
在输出时,我们需要实际输出i-1,j-1
代码如下
#include <stdio.h>
int main()
{
int n,i,j;
scanf("%d %d %d",&n,&i,&j);
int num=1;
int s,m;
int a[100][100]={1};
for(s=0;s<=n/2;s++)
{
for(m=s;m<=n-s-1;m++)
a[s][m]=num++;//上层
for(m=s+1;m<=n-s-1;m++)
a[m][n-s-1]=num++;//右层
for(m=n-s-2;m>=s;m--)
a[n-s-1][m]=num++;//下层
for(m=n-s-2;m>s;m--)
a[m][s]=num++;//左层
if(n%2==1)//n为奇数
a[n/2][n/2]=n*n;
}
printf("%d",a[i-1][j-1]);
return 0;
}