蛇形矩阵3a

蛇形矩阵3a

题目描述

把数1,2,3,4,5,…,N*N按照“蛇形3”放入N*N矩阵的中,然后有M个询问,每个询问为:

请计算第x行第y列的数是什么?

下面是N=6的蛇形3的图示

输入格式

第一行2个正整数:N,M,范围在[1,100000]。

下面有M行,每行2个整数,范围在[1,N]。

输出格式

M行,第i行是第i个询问的结果。

输入/输出例子1

输入:

6 4

1 1

2 2

4 3

3 2

输出:

1

21

36

32

方法一:暴力枚举(参考其他博客)(会超6个哦)

#include<bits/stdc++.h>

using namespace std;

unsigned long long a[5000][5000];

unsigned long long n,t=1,m,l,i,j,o;

unsigned long long b[110006],y[110009];

int main()

{

scanf("%lld",&n);

if(n%2==1)

m=n/2+1;

else

m=n/2;

for(i=1;i<=m;i++)

{

for(j=i;j<=n-i+1;j++)

{

a[i][j]=t;

t++;

}

for(j=1+i;j<=n-i+1;j++)

{

a[j][n-i+1]=t;

t++;

}

for(j=n-i;j>=i;j--)

{

a[n-i+1][j]=t;

t++;

}

for(j=n-i;j>=1+i;j--)

{

a[j][i]=t;

t++;

}

}

scanf("%lld",&l);

for(o=1;o<=l;o++)

{

scanf("%lld%lld",&b[o],&y[o]);

for(int i=1;i<=n;i++)

{

for(j=1;j<=n;j++)

{

if((b[o]==i)&&(y[o]==j))printf("%lld",a[i][j]);

}

}

cout<<endl;

}

return 0;

}

方法二 原创(这个百分百全对)

#include<bits/stdc++.h>

using namespace std;

long long n,o,m,a,li,x,y,ua,ha;

long long mins1,mins2,s[9999999];

int main()

{

scanf("%lld%lld",&n,&m);

o=n-1;

s[1]=1;

for(int i=2;i<=n;i++)

{

s[i]=s[i-1]+4*o;

o=o-2;

}

for(int i=1;i<=m;i++)

{

scanf("%lld%lld",&x,&y);

mins1=min(n-x+1,n-y+1);

mins2=min(y,mins1);

ha=min(x,mins2);

o=(n-1)-2*(ha-1);

if(x==1&&y==1)cout<<"1"<<endl;

else if((x>n)||(y>n))cout<<"0"<<endl;

else if(x==ha)cout<<s[ha]+(y-ha)<<endl;

else if(y==ha)cout<<s[ha+1]-(x-ha)<<endl;

else if(n-x+1==ha)cout<<s[ha]+3*o-(y-ha)<<endl;

else cout<<s[ha]+o+(x-ha)<<endl;

}

return 0;

}

谢谢

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值