可以根据横纵坐标变化进行修改 x、y 的位置,也就是该改变矩阵起始位置,或者方向(顺时针、逆时针)
//n 矩阵边长
int getNum(int n,int x,int y)
{
int r = 0;
if(x<=y && x+y<=n+1)
{
r=x;
return 4*(r-1)*n-4*(r-1)*(r-1)+1+y-r;
}
if(x<=y && x+y>=n+1)
{
r=n-y+1;
return 4*(r-1)*n-4*(r-1)*(r-1)+1+n-2*r+1+x-r;
}
if(x>=y && x+y>=n+1)
{
r=n-x+1;
return 4*(r-1)*n-4*(r-1)*(r-1)+1+3*n-6*r+3-y+r;
}
if(x>=y && x+y<=n+1)
{
r=y;
return 4*(r-1)*n-4*(r-1)*(r-1)+1+4*n-8*r+4-x+r;
}
return 0;
}
注:下题代码暂时有误,请谨慎借鉴
例题:
The Preliminary Contest for ICPC Asia Nanjing 2019
The beautiful values of the palace
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
#define ll unsigned long long
ll n;
struct node{
ll x,y,num;
}use[100100];
ll getNum(ll x,ll y)
{
ll r=0;
if(x<=y && x+y<=n+1)
{
r=x;
return 4*(r-1)*n-4*(r-1)*(r-1)+1+y-r;
}
if(x<=y && x+y>=n+1)
{
r=n-y+1;
return 4*(r-1)*n-4*(r-1)*(r-1)+1+n-2*r+1+x-r;
}
if(x>=y && x+y>=n+1)
{
r=n-x+1;
return 4*(r-1)*n-4*(r-1)*(r-1)+1+3*n-6*r+3-y+r;
}
if(x>=y && x+y<=n+1)
{
r=y;
return 4*(r-1)*n-4*(r-1)*(r-1)+1+4*n-8*r+4-x+r;
}
return 0;
}
int main()
{
ll t;
cin>>t;
while(t--)
{
ll m,p;
scanf("%llu%llu%llu",&n,&m,&p);
for(ll i=1;i<=m;i++)
{
ll x,y;
scanf("%llu%llu",&x,&y);
use[i].x=x,use[i].y=y;
if(x<=n&&y<=n&&x>0&&y>0)
use[i].num=getNum(n-x+1,n-y+1);
else
use[i].num=0;
// cout<<x<<" "<<y<<" "<<use[i].num<<endl;
}
for(ll i=1;i<=p;i++)
{
ll sum=0;
ll x1,y1,x2,y2;
scanf("%llu%llu%llu%llu",&x1,&y1,&x2,&y2);
for(ll i=1;i<=m;i++)
{
if(use[i].x>=x1&&use[i].x<=x2&&use[i].y>=y1&&use[i].y<=y2)
{
// cout<<use[i].num<<endl;
sum+=use[i].num;
}
}
printf("%llu\n",sum);
}
}
return 0;
}