蛇形矩阵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;
}
谢谢