螺旋矩阵

一个n行n列的螺旋矩阵可由如下方法生成:
从矩阵的左上角(第1行第1列)出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入1,2,3,...,n2,便构成了一个螺旋矩阵。
下图是一个n=4时的螺旋矩阵。

现给出矩阵大小n以及i和j,请你求出该矩阵中第i行第j列的数是多少。
 

输入

输入共一行,包含三个整数 n,i,j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。
1≤n≤30000,1≤i≤n,1≤j≤n

 

输出

输出共一行,包含一个整数,表示相应矩阵中第i行第j列的数。

 

思路是存贮每一环的值于sum数组

然后找到i,j对应在第k环中;

从环的左上角的值计算i,j到k,k的距离

需分几种情况

我分了三种

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>     
#include<algorithm>
#define ll long long
using namespace std;
#define hengheng main()
#define mem(a,b) memset(a,b,sizeof(a))
const int maxx=1e9+7;

int sum[30002];
int main()
{
	int i,j,n,m,k,count,x,y,t;
	scanf("%d%d%d",&n,&x,&y);
	// 思路:用sum数组存储每一圈的值; 
//scanf("%d",&n);
//	while(scanf("%d%d",&x,&y)!=EOF)
	{
		k=0;t=n;
		i=1;
		while(k<=n*n&&t>0)
		{
			sum[i]=4*t-4;
			t-=2;
			k+=sum[i];
			i++; 
		}
		if(n%2==1) 
		sum[i-1]=1;
		int ans=0;
	//	for(j=1;j<i;j++)
	//	printf("%d\n",sum[j]);
		for(i=1;i<=n;i++)   // 找在哪一环 
		{
			if((x==i||y==i)||(x==n-i+1||y==n-i+1))
			{
				k=i;
				break;
			}
		}
		for(i=1;i<k;i++)
		ans+=sum[i];
	//	printf("%d\n",ans);
	//前k-1环的值 
		if(y==k) // 与k,k在同一列 ,计算少的用sun【k】减去即可 
		{
			t=x-k;
			if(t!=0)
			ans+=sum[k]-t;
		}
		else 
		{
			if(x==n-k+1)// 如果在下面 
			{ 
				t=n-3*k+y+1;//计算少的用sun【k】减去即可  n-k+1为第y列于第k列距离 y-k为一列的差值 
				ans+=sum[k]-t;
			}
			else
			{
				t=(x-k)+(y-k);// 在右边就不用多说了 
				ans+=t;
			}
		}
		
		printf("%d\n",ans+1);// 别忘了加 1 
	}
	
	return 0;
 } 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值